Changeset 211539 in webkit


Ignore:
Timestamp:
Feb 1, 2017, 3:38:04 PM (8 years ago)
Author:
eric.carlson@apple.com
Message:

[Mac] Update CARingBuffer class
https://bugs.webkit.org/show_bug.cgi?id=167656

Reviewed by NOBODY (OOPS!).

Source/WebCore:

API test CARingBufferTest added.

  • WebCore.xcodeproj/project.pbxproj: Add headers to framework so they can be used from the API test.
  • platform/audio/AudioStreamDescription.h: Add Int32.
  • platform/audio/mac/CAAudioStreamDescription.cpp:

(WebCore::CAAudioStreamDescription::CAAudioStreamDescription):
(WebCore::CAAudioStreamDescription::~CAAudioStreamDescription):
(WebCore::CAAudioStreamDescription::format): Support Int32.
(WebCore::CAAudioStreamDescription::operator==): Make inline.

  • platform/audio/mac/CAAudioStreamDescription.h:
  • platform/audio/mac/CARingBuffer.cpp:

(WebCore::CARingBuffer::CARingBuffer): Move initializers into class declaration.
(WebCore::CARingBuffer::allocate): Use flush method, get allocation info from a CAAudioStreamDescription.
(WebCore::FetchABL): Add a mode parameter to allow samples to replace or mix into destination.
(WebCore::CARingBuffer::flush): New.
(WebCore::CARingBuffer::fetch): Add mode parameter.
(WebCore::CARingBuffer::~CARingBuffer): Deleted.

  • platform/audio/mac/CARingBuffer.h:

(WebCore::CARingBuffer::~CARingBuffer):

  • platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm:

(WebCore::AudioSourceProviderAVFObjC::prepare): Use new CARingBuffer constructor.
(WebCore::operator==): Deleted.
(WebCore::operator!=): Deleted.

  • platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:

(WebCore::WebAudioSourceProviderAVFObjC::prepare): Use new CARingBuffer constructor
(WebCore::operator==): Deleted.
(WebCore::operator!=): Deleted.

Tools:

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/Tests/WebCore/CARingBuffer.cpp: Added.

(TestWebKitAPI::CARingBufferTest::SetUp):
(TestWebKitAPI::CARingBufferTest::setup):
(TestWebKitAPI::CARingBufferTest::setListDataBuffer):
(TestWebKitAPI::CARingBufferTest::description):
(TestWebKitAPI::CARingBufferTest::bufferList):
(TestWebKitAPI::CARingBufferTest::ringBuffer):
(TestWebKitAPI::CARingBufferTest::capacity):
(TestWebKitAPI::CARingBufferTest::audioBufferListSizeForStream):
(TestWebKitAPI::CARingBufferTest::configureBufferListForStream):
(TestWebKitAPI::TEST_F):
(TestWebKitAPI::MixingTest::run):

Location:
trunk
Files:
1 added
11 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/Source/WebCore/ChangeLog

    r211531 r211539  
     12017-02-01  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [Mac] Update CARingBuffer class
     4        https://bugs.webkit.org/show_bug.cgi?id=167656
     5
     6        Reviewed by Jer Noble.
     7
     8        API test CARingBufferTest added.
     9
     10        * WebCore.xcodeproj/project.pbxproj: Add headers to framework so they can be used from the API test.
     11
     12        * platform/audio/AudioStreamDescription.h: Add Int32.
     13
     14        * platform/audio/mac/CAAudioStreamDescription.cpp:
     15        (WebCore::CAAudioStreamDescription::CAAudioStreamDescription):
     16        (WebCore::CAAudioStreamDescription::~CAAudioStreamDescription):
     17        (WebCore::CAAudioStreamDescription::format): Support Int32.
     18        (WebCore::CAAudioStreamDescription::operator==): Make inline.
     19        * platform/audio/mac/CAAudioStreamDescription.h:
     20
     21        * platform/audio/mac/CARingBuffer.cpp:
     22        (WebCore::CARingBuffer::CARingBuffer): Move initializers into class declaration.
     23        (WebCore::CARingBuffer::allocate): Use flush method, get allocation info from a CAAudioStreamDescription.
     24        (WebCore::FetchABL): Add a mode parameter to allow samples to replace or mix into destination.
     25        (WebCore::CARingBuffer::flush): New.
     26        (WebCore::CARingBuffer::fetch): Add mode parameter.
     27        (WebCore::CARingBuffer::~CARingBuffer): Deleted.
     28        * platform/audio/mac/CARingBuffer.h:
     29        (WebCore::CARingBuffer::~CARingBuffer):
     30
     31        * platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm:
     32        (WebCore::AudioSourceProviderAVFObjC::prepare): Use new CARingBuffer constructor.
     33        (WebCore::operator==): Deleted.
     34        (WebCore::operator!=): Deleted.
     35
     36        * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:
     37        (WebCore::WebAudioSourceProviderAVFObjC::prepare): Use new CARingBuffer constructor
     38        (WebCore::operator==): Deleted.
     39        (WebCore::operator!=): Deleted.
     40
    1412017-02-01  Zalan Bujtas  <zalan@apple.com>
    242
  • TabularUnified trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r211473 r211539  
    279279                07B7116E1D899E63009F0FFB /* CaptureDeviceManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07B7116B1D899E63009F0FFB /* CaptureDeviceManager.cpp */; };
    280280                07B7116F1D899E63009F0FFB /* CaptureDeviceManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B7116C1D899E63009F0FFB /* CaptureDeviceManager.h */; };
     281                07C046C31E42508B007201E7 /* CAAudioStreamDescription.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 073B87571E40DCFD0071C0EC /* CAAudioStreamDescription.cpp */; };
     282                07C046C41E42508B007201E7 /* CAAudioStreamDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 073B87581E40DCFD0071C0EC /* CAAudioStreamDescription.h */; settings = {ATTRIBUTES = (Private, ); }; };
     283                07C046C71E425155007201E7 /* AudioTrackPrivateMediaStreamCocoa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07C046C51E42512F007201E7 /* AudioTrackPrivateMediaStreamCocoa.cpp */; };
     284                07C046C81E425155007201E7 /* AudioTrackPrivateMediaStreamCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 07C046C61E42512F007201E7 /* AudioTrackPrivateMediaStreamCocoa.h */; };
     285                07C046CB1E426413007201E7 /* AudioStreamDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 073B87561E40DCE50071C0EC /* AudioStreamDescription.h */; settings = {ATTRIBUTES = (Private, ); }; };
    281286                07C1C0E21BFB600100BD2256 /* MediaTrackSupportedConstraints.h in Headers */ = {isa = PBXBuildFile; fileRef = 07C1C0E01BFB600100BD2256 /* MediaTrackSupportedConstraints.h */; };
    282287                07C1C0E51BFB60ED00BD2256 /* RealtimeMediaSourceSupportedConstraints.h in Headers */ = {isa = PBXBuildFile; fileRef = 07C1C0E41BFB60ED00BD2256 /* RealtimeMediaSourceSupportedConstraints.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    58985903                CDC69DDB16371FD4007C38DF /* WebCoreFullScreenPlaceholderView.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDC69DD916371FD3007C38DF /* WebCoreFullScreenPlaceholderView.mm */; };
    58995904                CDC734141977896C0046BFC5 /* CARingBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDC734121977896C0046BFC5 /* CARingBuffer.cpp */; };
    5900                 CDC734151977896D0046BFC5 /* CARingBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = CDC734131977896C0046BFC5 /* CARingBuffer.h */; };
     5905                CDC734151977896D0046BFC5 /* CARingBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = CDC734131977896C0046BFC5 /* CARingBuffer.h */; settings = {ATTRIBUTES = (Private, ); }; };
    59015906                CDC8B5A2180463470016E685 /* MediaPlayerPrivateMediaSourceAVFObjC.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDC8B5A0180463470016E685 /* MediaPlayerPrivateMediaSourceAVFObjC.mm */; };
    59025907                CDC8B5A3180463470016E685 /* MediaPlayerPrivateMediaSourceAVFObjC.h in Headers */ = {isa = PBXBuildFile; fileRef = CDC8B5A1180463470016E685 /* MediaPlayerPrivateMediaSourceAVFObjC.h */; };
     
    1535215357                                07707CB11E20649C00005BF7 /* AudioCaptureSourceProviderObjC.h */,
    1535315358                                07707CAF1E205EC400005BF7 /* AudioSourceObserverObjC.h */,
     15359                                07C046C51E42512F007201E7 /* AudioTrackPrivateMediaStreamCocoa.cpp */,
     15360                                07C046C61E42512F007201E7 /* AudioTrackPrivateMediaStreamCocoa.h */,
    1535415361                                070363D8181A1CDC00C074A5 /* AVAudioCaptureSource.h */,
    1535515362                                070363D9181A1CDC00C074A5 /* AVAudioCaptureSource.mm */,
     
    2489024897                        isa = PBXGroup;
    2489124898                        children = (
    24892                                 073B87571E40DCFD0071C0EC /* CAAudioStreamDescription.cpp */,
    24893                                 073B87581E40DCFD0071C0EC /* CAAudioStreamDescription.h */,
    2489424899                                FD3160B512B0272A00C1A359 /* AudioBusMac.mm */,
    2489524900                                FD3160B612B0272A00C1A359 /* AudioDestinationMac.cpp */,
     
    2490224907                                CDC734121977896C0046BFC5 /* CARingBuffer.cpp */,
    2490324908                                CDC734131977896C0046BFC5 /* CARingBuffer.h */,
     24909                                073B87571E40DCFD0071C0EC /* CAAudioStreamDescription.cpp */,
     24910                                073B87581E40DCFD0071C0EC /* CAAudioStreamDescription.h */,
    2490424911                                FD3160BA12B0272A00C1A359 /* FFTFrameMac.cpp */,
    2490524912                                CD669D671D232E10004D1866 /* MediaSessionManagerMac.h */,
     
    2657226579                                75793EC90D0CE72D007FC0AC /* JSMessageEvent.h in Headers */,
    2657326580                                E1ADEDDA0E76BD93004A1A5E /* JSMessagePort.h in Headers */,
     26581                                07C046CB1E426413007201E7 /* AudioStreamDescription.h in Headers */,
    2657426582                                CDF4B7301E03CA4A00E235A2 /* JSMockCDMFactory.h in Headers */,
    2657526583                                2D6F3E951C1F85550061DBD4 /* JSMockPageOverlay.h in Headers */,
     
    2769627704                                2D76BB821945632400CFD29A /* RunLoopObserver.h in Headers */,
    2769727705                                1A569D1F0D7E2B82007C3983 /* runtime_array.h in Headers */,
     27706                                07C046C41E42508B007201E7 /* CAAudioStreamDescription.h in Headers */,
    2769827707                                1A569D210D7E2B82007C3983 /* runtime_method.h in Headers */,
    2769927708                                1A569D230D7E2B82007C3983 /* runtime_object.h in Headers */,
     
    2776127770                                0FEA3E80191B3169000F1B55 /* ScrollingTreeOverflowScrollingNode.h in Headers */,
    2776227771                                9391A99D1629D70000297330 /* ScrollingTreeScrollingNode.h in Headers */,
     27772                                07C046C81E425155007201E7 /* AudioTrackPrivateMediaStreamCocoa.h in Headers */,
    2776327773                                0FB8890A167D2FA10010CDA5 /* ScrollingTreeStickyNode.h in Headers */,
    2776427774                                7AAFE8D019CB8672000F56D8 /* ScrollLatchingState.h in Headers */,
     
    2831628326                                FFAC30FE184FB145008C4F1E /* TrailingObjects.h in Headers */,
    2831728327                                516071321BD8308B00DBC4F2 /* TransactionOperation.h in Headers */,
     28328                                07C046C21E425022007201E7 /* AudioSampleDataSource.h in Headers */,
    2831828329                                49E911C40EF86D47009D0CAF /* TransformationMatrix.h in Headers */,
    2831928330                                FB484F4D171F821E00040755 /* TransformFunctions.h in Headers */,
     
    3042330434                                FDA15EB112B03EE1003A583A /* JSPannerNode.cpp in Sources */,
    3042430435                                E51A81DF17298D7700BFCA61 /* JSPerformance.cpp in Sources */,
     30436                                07C046C11E425022007201E7 /* AudioSampleDataSource.cpp in Sources */,
    3042530437                                CB38FD511CCF938900592A3F /* JSPerformanceEntry.cpp in Sources */,
    3042630438                                CB38FD571CD21E2A00592A3F /* JSPerformanceEntryCustom.cpp in Sources */,
     
    3076830780                                A513B3D8114B166A001C429B /* KeyEventCocoa.mm in Sources */,
    3076930781                                2655413A1489811C000DFC5D /* KeyEventIOS.mm in Sources */,
     30782                                07C046C31E42508B007201E7 /* CAAudioStreamDescription.cpp in Sources */,
    3077030783                                935C477009AC4D7300A6AAB4 /* KeyEventMac.mm in Sources */,
    3077130784                                316FE1190E6E1DA700BF6088 /* KeyframeAnimation.cpp in Sources */,
     
    3201432027                                6F995A231A7078B100A735F4 /* WebGLTransformFeedback.cpp in Sources */,
    3201532028                                0C3F1F5A10C8871200D72CE1 /* WebGLUniformLocation.cpp in Sources */,
     32029                                07C046C71E425155007201E7 /* AudioTrackPrivateMediaStreamCocoa.cpp in Sources */,
    3201632030                                6F995A251A7078B100A735F4 /* WebGLVertexArrayObject.cpp in Sources */,
    3201732031                                6F222B761AB52D8A0094651A /* WebGLVertexArrayObjectBase.cpp in Sources */,
  • TabularUnified trunk/Source/WebCore/platform/audio/AudioStreamDescription.h

    r211437 r211539  
    4949        None,
    5050        Int16,
     51        Int32,
    5152        Float32,
    5253        Float64
  • TabularUnified trunk/Source/WebCore/platform/audio/mac/CAAudioStreamDescription.cpp

    r211437 r211539  
    2929namespace WebCore {
    3030
     31CAAudioStreamDescription::CAAudioStreamDescription()
     32    : m_streamDescription({ })
     33{
     34}
     35   
     36CAAudioStreamDescription::~CAAudioStreamDescription()
     37{
     38}
     39
    3140CAAudioStreamDescription::CAAudioStreamDescription(const AudioStreamBasicDescription &desc)
    3241    : m_streamDescription(desc)
     
    4756    int wordsize;
    4857    switch (format) {
     58    case Int16:
     59        wordsize = 2;
     60        m_streamDescription.mFormatFlags |= kAudioFormatFlagIsSignedInteger;
     61        break;
     62    case Int32:
     63        wordsize = 4;
     64        m_streamDescription.mFormatFlags |= kAudioFormatFlagIsSignedInteger;
     65        break;
    4966    case Float32:
    5067        wordsize = 4;
     
    5471        wordsize = 8;
    5572        m_streamDescription.mFormatFlags |= kAudioFormatFlagIsFloat;
    56         break;
    57     case Int16:
    58         wordsize = 2;
    59         m_streamDescription.mFormatFlags |= kAudioFormatFlagIsSignedInteger;
    6073        break;
    6174    case None:
     
    110123            if (wordsize == sizeof(float))
    111124                return m_format = Float32;
    112             else if (wordsize == sizeof(double))
     125            if (wordsize == sizeof(double))
    113126                return m_format = Float64;
    114127
     
    118131        if (m_streamDescription.mFormatFlags & kLinearPCMFormatFlagIsSignedInteger) {
    119132            unsigned fractionBits = (m_streamDescription.mFormatFlags & kLinearPCMFormatFlagsSampleFractionMask) >> kLinearPCMFormatFlagsSampleFractionShift;
    120             if (wordsize == 2 && !fractionBits)
    121                 return m_format = Int16;
     133            if (!fractionBits) {
     134                if (wordsize == sizeof(int16_t))
     135                    return m_format = Int16;
     136                if (wordsize == sizeof(int32_t))
     137                    return m_format = Int32;
     138            }
    122139        }
    123140    }
    124141
    125142    return None;
    126 }
    127 
    128 bool CAAudioStreamDescription::operator==(const AudioStreamDescription& other)
    129 {
    130     if (other.platformDescription().type != PlatformDescription::CAAudioStreamBasicType)
    131         return false;
    132 
    133     return operator==(*WTF::get<const AudioStreamBasicDescription*>(other.platformDescription().description));
    134143}
    135144
  • TabularUnified trunk/Source/WebCore/platform/audio/mac/CAAudioStreamDescription.h

    r211437 r211539  
    3636class CAAudioStreamDescription final : public AudioStreamDescription {
    3737public:
    38     CAAudioStreamDescription(const AudioStreamBasicDescription&);
    39     CAAudioStreamDescription(double, uint32_t, PCMFormat, bool);
     38
     39    WEBCORE_EXPORT CAAudioStreamDescription();
     40    WEBCORE_EXPORT CAAudioStreamDescription(const AudioStreamBasicDescription&);
     41    WEBCORE_EXPORT CAAudioStreamDescription(double, uint32_t, PCMFormat, bool);
     42    WEBCORE_EXPORT ~CAAudioStreamDescription();
    4043
    4144    const PlatformDescription& platformDescription() const final;
     
    4447
    4548    double sampleRate() const final { return m_streamDescription.mSampleRate; }
    46 
     49    bool isPCM() const final { return m_streamDescription.mFormatID == kAudioFormatLinearPCM; }
    4750    bool isInterleaved() const final { return !(m_streamDescription.mFormatFlags & kAudioFormatFlagIsNonInterleaved); }
    4851    bool isSignedInteger() const final { return isPCM() && (m_streamDescription.mFormatFlags & kAudioFormatFlagIsSignedInteger); }
     
    6265    bool operator==(const AudioStreamBasicDescription& other) { return m_streamDescription == other; }
    6366    bool operator!=(const AudioStreamBasicDescription& other) { return !operator == (other); }
    64     bool operator==(const AudioStreamDescription&);
     67    bool operator==(const AudioStreamDescription& other)
     68    {
     69        if (other.platformDescription().type != PlatformDescription::CAAudioStreamBasicType)
     70            return false;
     71
     72        return operator==(*WTF::get<const AudioStreamBasicDescription*>(other.platformDescription().description));
     73    }
    6574    bool operator!=(const AudioStreamDescription& other) { return !operator == (other); }
    6675
  • TabularUnified trunk/Source/WebCore/platform/audio/mac/CARingBuffer.cpp

    r201432 r211539  
    2929#if ENABLE(WEB_AUDIO) && USE(MEDIATOOLBOX)
    3030
     31#include "CAAudioStreamDescription.h"
     32#include <Accelerate/Accelerate.h>
    3133#include <CoreAudio/CoreAudioTypes.h>
    3234#include <wtf/MathExtras.h>
     
    3840
    3941CARingBuffer::CARingBuffer()
    40     : m_channelCount(0)
    41     , m_frameCount(0)
    42     , m_capacityBytes(0)
    43     , m_timeBoundsQueue(kGeneralRingTimeBoundsQueueSize)
    44     , m_timeBoundsQueuePtr(0)
    45 {
    46 }
    47 
    48 CARingBuffer::~CARingBuffer()
    49 {
    50     deallocate();
     42    : m_timeBoundsQueue(kGeneralRingTimeBoundsQueueSize)
     43{
     44}
     45
     46void CARingBuffer::allocate(const CAAudioStreamDescription& format, size_t frameCount)
     47{
     48    m_description = format;
     49    allocate(format.numberOfChannelStreams(), format.bytesPerFrame(), frameCount);
    5150}
    5251
     
    7574    }
    7675
    77     for (auto timeBounds : m_timeBoundsQueue) {
    78         timeBounds.m_startFrame = 0;
    79         timeBounds.m_endFrame = 0;
    80         timeBounds.m_updateCounter = 0;
    81     }
    82     m_timeBoundsQueuePtr = 0;
     76    flush();
    8377}
    8478
     
    114108}
    115109
    116 static void FetchABL(AudioBufferList* list, size_t destOffset, Byte** buffers, size_t srcOffset, size_t nbytes)
     110static void FetchABL(AudioBufferList* list, size_t destOffset, Byte** buffers, size_t srcOffset, size_t nbytes, AudioStreamDescription::PCMFormat format, CARingBuffer::FetchMode mode)
    117111{
    118112    int channelCount = list->mNumberBuffers;
     
    121115        if (destOffset > dest->mDataByteSize)
    122116            continue;
    123         memcpy(static_cast<Byte*>(dest->mData) + destOffset, *buffers + srcOffset, std::min<size_t>(nbytes, dest->mDataByteSize - destOffset));
     117
     118        nbytes = std::min<size_t>(nbytes, dest->mDataByteSize - destOffset);
     119        if (mode == CARingBuffer::Copy)
     120            memcpy(static_cast<Byte*>(dest->mData) + destOffset, *buffers + srcOffset, nbytes);
     121        else {
     122            switch (format) {
     123            case AudioStreamDescription::Int16: {
     124                int16_t* destination = static_cast<int16_t*>(dest->mData);
     125                int16_t* source = reinterpret_cast<int16_t*>(*buffers + srcOffset);
     126                for (size_t i = 0; i < nbytes / sizeof(int16_t); i++)
     127                    destination[i] += source[i];
     128                break;
     129            }
     130            case AudioStreamDescription::Int32: {
     131                int32_t* destination = static_cast<int32_t*>(dest->mData);
     132                vDSP_vaddi(destination, 1, reinterpret_cast<int32_t*>(*buffers + srcOffset), 1, destination, 1, nbytes / sizeof(int32_t));
     133                break;
     134            }
     135            case AudioStreamDescription::Float32: {
     136                float* destination = static_cast<float*>(dest->mData);
     137                vDSP_vadd(destination, 1, reinterpret_cast<float*>(*buffers + srcOffset), 1, destination, 1, nbytes / sizeof(float));
     138                break;
     139            }
     140            case AudioStreamDescription::Float64: {
     141                double* destination = static_cast<double*>(dest->mData);
     142                vDSP_vaddD(destination, 1, reinterpret_cast<double*>(*buffers + srcOffset), 1, destination, 1, nbytes / sizeof(double));
     143                break;
     144            }
     145            case AudioStreamDescription::None:
     146                ASSERT_NOT_REACHED();
     147                break;
     148            }
     149        }
    124150        ++buffers;
    125151        ++dest;
     
    137163        ++dest;
    138164    }
     165}
     166
     167void CARingBuffer::flush()
     168{
     169    LockHolder locker(m_currentFrameBoundsLock);
     170    for (auto& timeBounds : m_timeBoundsQueue) {
     171        timeBounds.m_startFrame = 0;
     172        timeBounds.m_endFrame = 0;
     173        timeBounds.m_updateCounter = 0;
     174    }
     175    m_timeBoundsQueuePtr = 0;
    139176}
    140177
     
    250287}
    251288
    252 CARingBuffer::Error CARingBuffer::fetch(AudioBufferList* list, size_t nFrames, uint64_t startRead)
     289CARingBuffer::Error CARingBuffer::fetch(AudioBufferList* list, size_t nFrames, uint64_t startRead, FetchMode mode)
    253290{
    254291    if (!nFrames)
     
    287324    if (offset0 < offset1) {
    288325        nbytes = offset1 - offset0;
    289         FetchABL(list, destStartByteOffset, buffers, offset0, nbytes);
     326        FetchABL(list, destStartByteOffset, buffers, offset0, nbytes, m_description.format(), mode);
    290327    } else {
    291328        nbytes = m_capacityBytes - offset0;
    292         FetchABL(list, destStartByteOffset, buffers, offset0, nbytes);
    293         FetchABL(list, destStartByteOffset + nbytes, buffers, 0, offset1);
     329        FetchABL(list, destStartByteOffset, buffers, offset0, nbytes, m_description.format(), mode);
     330        if (offset1)
     331            FetchABL(list, destStartByteOffset + nbytes, buffers, 0, offset1, m_description.format(), mode);
    294332        nbytes += offset1;
    295333    }
  • TabularUnified trunk/Source/WebCore/platform/audio/mac/CARingBuffer.h

    r201432 r211539  
    2424 */
    2525
    26 #ifndef CARingBuffer_h
    27 #define CARingBuffer_h
     26#pragma once
    2827
    2928#if ENABLE(WEB_AUDIO) && USE(MEDIATOOLBOX)
    3029
     30#include "AudioStreamDescription.h"
     31#include "CAAudioStreamDescription.h"
    3132#include <runtime/ArrayBuffer.h>
    3233#include <wtf/Lock.h>
     
    3940class CARingBuffer {
    4041public:
    41     CARingBuffer();
    42     ~CARingBuffer();
     42    WEBCORE_EXPORT CARingBuffer();
     43    WEBCORE_EXPORT ~CARingBuffer()
     44    {
     45        deallocate();
     46    }
    4347
    4448    enum Error {
    4549        Ok,
    4650        TooMuch, // fetch start time is earlier than buffer start time and fetch end time is later than buffer end time
    47         CPUOverload, // the reader is unable to get enough CPU cycles to capture a consistent snapshot of the time bounds
    4851    };
    4952
    50     void allocate(uint32_t m_channelCount, size_t bytesPerFrame, size_t frameCount);
    51     void deallocate();
    52     Error store(const AudioBufferList*, size_t frameCount, uint64_t startFrame);
    53     Error fetch(AudioBufferList*, size_t frameCount, uint64_t startFrame);
    54     void getCurrentFrameBounds(uint64_t &startTime, uint64_t &endTime);
     53    WEBCORE_EXPORT void allocate(const CAAudioStreamDescription&, size_t);
     54    WEBCORE_EXPORT void deallocate();
     55
     56    WEBCORE_EXPORT Error store(const AudioBufferList*, size_t frameCount, uint64_t startFrame);
     57
     58    enum FetchMode { Copy, Mix };
     59    WEBCORE_EXPORT Error fetch(AudioBufferList*, size_t frameCount, uint64_t startFrame, FetchMode mode = Copy);
     60
     61    WEBCORE_EXPORT void flush();
     62
     63    WEBCORE_EXPORT void getCurrentFrameBounds(uint64_t &startTime, uint64_t &endTime);
    5564
    5665    uint32_t channelCount() const { return m_channelCount; }
    5766
    5867private:
     68    void allocate(uint32_t m_channelCount, size_t bytesPerFrame, size_t frameCount);
    5969    size_t frameOffset(uint64_t frameNumber) { return (frameNumber & m_frameCountMask) * m_bytesPerFrame; }
    6070
     
    6676
    6777    RefPtr<ArrayBuffer> m_buffers;
    68     uint32_t m_channelCount;
    69     size_t m_bytesPerFrame;
    70     uint32_t m_frameCount;
    71     uint32_t m_frameCountMask;
    72     size_t m_capacityBytes;
     78    uint32_t m_channelCount { 0 };
     79    size_t m_bytesPerFrame { 0 };
     80    uint32_t m_frameCount { 0 };
     81    uint32_t m_frameCountMask { 0 };
     82    size_t m_capacityBytes { 0 };
    7383
    7484    struct TimeBounds {
     
    8393        volatile uint32_t m_updateCounter;
    8494    };
    85    
     95
     96    CAAudioStreamDescription m_description;
    8697    Vector<TimeBounds> m_timeBoundsQueue;
    8798    Lock m_currentFrameBoundsLock;
    88     std::atomic<int32_t> m_timeBoundsQueuePtr;
     99    std::atomic<int32_t> m_timeBoundsQueuePtr { 0 };
    89100};
    90101
     
    92103
    93104#endif // ENABLE(WEB_AUDIO) && USE(MEDIATOOLBOX)
    94 
    95 #endif // CARingBuffer_h
  • TabularUnified trunk/Source/WebCore/platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm

    r203303 r211539  
    265265}
    266266
    267 static bool operator==(const AudioStreamBasicDescription& a, const AudioStreamBasicDescription& b)
    268 {
    269     return a.mSampleRate == b.mSampleRate
    270         && a.mFormatID == b.mFormatID
    271         && a.mFormatFlags == b.mFormatFlags
    272         && a.mBytesPerPacket == b.mBytesPerPacket
    273         && a.mFramesPerPacket == b.mFramesPerPacket
    274         && a.mBytesPerFrame == b.mBytesPerFrame
    275         && a.mChannelsPerFrame == b.mChannelsPerFrame
    276         && a.mBitsPerChannel == b.mBitsPerChannel;
    277 }
    278 
    279 static bool operator!=(const AudioStreamBasicDescription& a, const AudioStreamBasicDescription& b)
    280 {
    281     return !(a == b);
    282 }
    283 
    284267void AudioSourceProviderAVFObjC::prepare(CMItemCount maxFrames, const AudioStreamBasicDescription *processingFormat)
    285268{
     
    290273    m_tapDescription = std::make_unique<AudioStreamBasicDescription>(*processingFormat);
    291274    int numberOfChannels = processingFormat->mChannelsPerFrame;
    292     size_t bytesPerFrame = processingFormat->mBytesPerFrame;
    293275    double sampleRate = processingFormat->mSampleRate;
    294276    ASSERT(sampleRate >= 0);
     
    315297
    316298    m_ringBuffer = std::make_unique<CARingBuffer>();
    317     m_ringBuffer->allocate(numberOfChannels, bytesPerFrame, capacity);
     299    m_ringBuffer->allocate(CAAudioStreamDescription(*processingFormat), capacity);
    318300
    319301    // AudioBufferList is a variable-length struct, so create on the heap with a generic new() operator
  • TabularUnified trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm

    r210742 r211539  
    135135}
    136136
    137 static bool operator==(const AudioStreamBasicDescription& a, const AudioStreamBasicDescription& b)
    138 {
    139     return a.mSampleRate == b.mSampleRate
    140         && a.mFormatID == b.mFormatID
    141         && a.mFormatFlags == b.mFormatFlags
    142         && a.mBytesPerPacket == b.mBytesPerPacket
    143         && a.mFramesPerPacket == b.mFramesPerPacket
    144         && a.mBytesPerFrame == b.mBytesPerFrame
    145         && a.mChannelsPerFrame == b.mChannelsPerFrame
    146         && a.mBitsPerChannel == b.mBitsPerChannel;
    147 }
    148 
    149 static bool operator!=(const AudioStreamBasicDescription& a, const AudioStreamBasicDescription& b)
    150 {
    151     return !(a == b);
    152 }
    153 
    154137void WebAudioSourceProviderAVFObjC::prepare(const AudioStreamBasicDescription* format)
    155138{
     
    202185
    203186    m_ringBuffer = std::make_unique<CARingBuffer>();
    204     m_ringBuffer->allocate(numberOfChannels, format->mBytesPerFrame, static_cast<size_t>(capacity));
     187    m_ringBuffer->allocate(CAAudioStreamDescription(*format), static_cast<size_t>(capacity));
    205188
    206189    m_listBufferSize = static_cast<size_t>(bufferListSize);
  • TabularUnified trunk/Tools/ChangeLog

    r211526 r211539  
     12017-02-01  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [Mac] Update CARingBuffer class
     4        https://bugs.webkit.org/show_bug.cgi?id=167656
     5
     6        Reviewed by Jer Noble.
     7
     8        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     9        * TestWebKitAPI/Tests/WebCore/CARingBuffer.cpp: Added.
     10        (TestWebKitAPI::CARingBufferTest::SetUp):
     11        (TestWebKitAPI::CARingBufferTest::setup):
     12        (TestWebKitAPI::CARingBufferTest::setListDataBuffer):
     13        (TestWebKitAPI::CARingBufferTest::description):
     14        (TestWebKitAPI::CARingBufferTest::bufferList):
     15        (TestWebKitAPI::CARingBufferTest::ringBuffer):
     16        (TestWebKitAPI::CARingBufferTest::capacity):
     17        (TestWebKitAPI::CARingBufferTest::audioBufferListSizeForStream):
     18        (TestWebKitAPI::CARingBufferTest::configureBufferListForStream):
     19        (TestWebKitAPI::TEST_F):
     20        (TestWebKitAPI::MixingTest::run):
     21
    1222017-02-01  Alexey Proskuryakov  <ap@apple.com>
    223
  • TabularUnified trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r211354 r211539  
    2525                07492B3B1DF8B14C00633DE1 /* EnumerateMediaDevices.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07492B3A1DF8AE2D00633DE1 /* EnumerateMediaDevices.cpp */; };
    2626                07492B3C1DF8B86600633DE1 /* enumerateMediaDevices.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 07492B391DF8ADA400633DE1 /* enumerateMediaDevices.html */; };
     27                07C046CA1E4262A8007201E7 /* CARingBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07C046C91E42573E007201E7 /* CARingBuffer.cpp */; };
    2728                0F139E771A423A5B00F590F5 /* WeakObjCPtr.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F139E751A423A5300F590F5 /* WeakObjCPtr.mm */; };
    2829                0F139E781A423A6B00F590F5 /* PlatformUtilitiesCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F139E721A423A2B00F590F5 /* PlatformUtilitiesCocoa.mm */; };
     
    786787                07492B3A1DF8AE2D00633DE1 /* EnumerateMediaDevices.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EnumerateMediaDevices.cpp; sourceTree = "<group>"; };
    787788                0766DD1F1A5AD5200023E3BB /* PendingAPIRequestURL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PendingAPIRequestURL.cpp; sourceTree = "<group>"; };
     789                07C046C91E42573E007201E7 /* CARingBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CARingBuffer.cpp; sourceTree = "<group>"; };
    788790                0BCD833414857CE400EA2003 /* HashMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HashMap.cpp; sourceTree = "<group>"; };
    789791                0BCD85691485C98B00EA2003 /* SetForScope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SetForScope.cpp; sourceTree = "<group>"; };
     
    15911593                                CD89D0371C4EDB1300040A04 /* cocoa */,
    15921594                                7A909A6F1D877475007E10F8 /* AffineTransform.cpp */,
     1595                                07C046C91E42573E007201E7 /* CARingBuffer.cpp */,
    15931596                                7A909A701D877475007E10F8 /* FloatPoint.cpp */,
    15941597                                7A909A711D877475007E10F8 /* FloatRect.cpp */,
     
    26722675                                7C83E0C31D0A653A00FEBCF3 /* RemoteObjectRegistry.mm in Sources */,
    26732676                                7CCE7EC91A411A7E00447C4C /* RenderedImageFromDOMNode.mm in Sources */,
     2677                                07C046CA1E4262A8007201E7 /* CARingBuffer.cpp in Sources */,
    26742678                                7A909A7D1D877480007E10F8 /* AffineTransform.cpp in Sources */,
    26752679                                7CCE7ECA1A411A7E00447C4C /* RenderedImageFromDOMRange.mm in Sources */,
Note: See TracChangeset for help on using the changeset viewer.