Changeset 254446 in webkit


Ignore:
Timestamp:
Jan 13, 2020 12:21:23 PM (4 years ago)
Author:
youenn@apple.com
Message:

Split AudioTrackPrivateMediaStreamCocoa to implement remote audio rendering
https://bugs.webkit.org/show_bug.cgi?id=206172

Reviewed by Eric Carlson.

Refactor code to allow in the future rendering of media stream audio tracks in a remote process.
For that purpose, split AudioTrackPrivateMediaStreamCocoa functionality in two parts.
The first part is moved back to AudioTrackPrivateMediaStream.
The second part is platform specific and is defined in terms of an interface AudioMediaStreamTrackRenderer
and an in process implementation named AudioMediaStreamTrackRendererCocoa.

Make TrackPrivateBase and MediaStreamTrackPrivate public LoggerHelper.
This allows making AudioMediaStreamTrackRenderer and AudioSampleDataSource to take a LoggerHelper instead of a derived instance.

No change of behavior.

  • Sources.txt:
  • SourcesCocoa.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • platform/audio/mac/AudioSampleDataSource.h:
  • platform/audio/mac/AudioSampleDataSource.mm:

(WebCore::AudioSampleDataSource::create):
(WebCore::AudioSampleDataSource::AudioSampleDataSource):

  • platform/graphics/TrackPrivateBase.h:
  • platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h:
  • platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:

(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::updateTracks):

  • platform/mediastream/AudioMediaStreamTrackRenderer.h: Added.

(WebCore::AudioMediaStreamTrackRenderer::setMuted):
(WebCore::AudioMediaStreamTrackRenderer::setVolume):
(WebCore::AudioMediaStreamTrackRenderer::volume const):
(WebCore::AudioMediaStreamTrackRenderer::isMuted const):

  • platform/mediastream/AudioTrackPrivateMediaStream.cpp: Added.

(WebCore::AudioTrackPrivateMediaStream::setLogger):
(WebCore::AudioTrackPrivateMediaStream::AudioTrackPrivateMediaStream):
(WebCore::AudioTrackPrivateMediaStream::~AudioTrackPrivateMediaStream):
(WebCore::AudioTrackPrivateMediaStream::clear):
(WebCore::AudioTrackPrivateMediaStream::playInternal):
(WebCore::AudioTrackPrivateMediaStream::play):
(WebCore::AudioTrackPrivateMediaStream::pause):
(WebCore::AudioTrackPrivateMediaStream::setVolume):
(WebCore::AudioTrackPrivateMediaStream::volume const):
(WebCore::AudioTrackPrivateMediaStream::audioSamplesAvailable):
(WebCore::AudioTrackPrivateMediaStream::trackMutedChanged):
(WebCore::AudioTrackPrivateMediaStream::trackEnabledChanged):
(WebCore::AudioTrackPrivateMediaStream::updateRendererMutedState):
(WebCore::AudioTrackPrivateMediaStream::trackEnded):

  • platform/mediastream/AudioTrackPrivateMediaStream.h:
  • platform/mediastream/MediaStreamTrackPrivate.h:
  • platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.cpp: Added.

(WebCore::AudioMediaStreamTrackRendererCocoa::stop):
(WebCore::AudioMediaStreamTrackRendererCocoa::clear):
(WebCore::AudioMediaStreamTrackRendererCocoa::setPaused):
(WebCore::AudioMediaStreamTrackRendererCocoa::createAudioUnit):
(WebCore::AudioMediaStreamTrackRendererCocoa::pushSamples):
(WebCore::AudioMediaStreamTrackRendererCocoa::render):
(WebCore::AudioMediaStreamTrackRendererCocoa::inputProc):

  • platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.h: Added.
  • platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.h: Removed.
Location:
trunk/Source/WebCore
Files:
2 added
11 edited
1 copied
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r254439 r254446  
     12020-01-13  youenn fablet  <youenn@apple.com>
     2
     3        Split AudioTrackPrivateMediaStreamCocoa to implement remote audio rendering
     4        https://bugs.webkit.org/show_bug.cgi?id=206172
     5
     6        Reviewed by Eric Carlson.
     7
     8        Refactor code to allow in the future rendering of media stream audio tracks in a remote process.
     9        For that purpose, split AudioTrackPrivateMediaStreamCocoa functionality in two parts.
     10        The first part is moved back to AudioTrackPrivateMediaStream.
     11        The second part is platform specific and is defined in terms of an interface AudioMediaStreamTrackRenderer
     12        and an in process implementation named AudioMediaStreamTrackRendererCocoa.
     13
     14        Make TrackPrivateBase and MediaStreamTrackPrivate public LoggerHelper.
     15        This allows making AudioMediaStreamTrackRenderer and AudioSampleDataSource to take a LoggerHelper instead of a derived instance.
     16
     17        No change of behavior.
     18
     19        * Sources.txt:
     20        * SourcesCocoa.txt:
     21        * WebCore.xcodeproj/project.pbxproj:
     22        * platform/audio/mac/AudioSampleDataSource.h:
     23        * platform/audio/mac/AudioSampleDataSource.mm:
     24        (WebCore::AudioSampleDataSource::create):
     25        (WebCore::AudioSampleDataSource::AudioSampleDataSource):
     26        * platform/graphics/TrackPrivateBase.h:
     27        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h:
     28        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
     29        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::updateTracks):
     30        * platform/mediastream/AudioMediaStreamTrackRenderer.h: Added.
     31        (WebCore::AudioMediaStreamTrackRenderer::setMuted):
     32        (WebCore::AudioMediaStreamTrackRenderer::setVolume):
     33        (WebCore::AudioMediaStreamTrackRenderer::volume const):
     34        (WebCore::AudioMediaStreamTrackRenderer::isMuted const):
     35        * platform/mediastream/AudioTrackPrivateMediaStream.cpp: Added.
     36        (WebCore::AudioTrackPrivateMediaStream::setLogger):
     37        (WebCore::AudioTrackPrivateMediaStream::AudioTrackPrivateMediaStream):
     38        (WebCore::AudioTrackPrivateMediaStream::~AudioTrackPrivateMediaStream):
     39        (WebCore::AudioTrackPrivateMediaStream::clear):
     40        (WebCore::AudioTrackPrivateMediaStream::playInternal):
     41        (WebCore::AudioTrackPrivateMediaStream::play):
     42        (WebCore::AudioTrackPrivateMediaStream::pause):
     43        (WebCore::AudioTrackPrivateMediaStream::setVolume):
     44        (WebCore::AudioTrackPrivateMediaStream::volume const):
     45        (WebCore::AudioTrackPrivateMediaStream::audioSamplesAvailable):
     46        (WebCore::AudioTrackPrivateMediaStream::trackMutedChanged):
     47        (WebCore::AudioTrackPrivateMediaStream::trackEnabledChanged):
     48        (WebCore::AudioTrackPrivateMediaStream::updateRendererMutedState):
     49        (WebCore::AudioTrackPrivateMediaStream::trackEnded):
     50        * platform/mediastream/AudioTrackPrivateMediaStream.h:
     51        * platform/mediastream/MediaStreamTrackPrivate.h:
     52        * platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.cpp: Added.
     53        (WebCore::AudioMediaStreamTrackRendererCocoa::stop):
     54        (WebCore::AudioMediaStreamTrackRendererCocoa::clear):
     55        (WebCore::AudioMediaStreamTrackRendererCocoa::setPaused):
     56        (WebCore::AudioMediaStreamTrackRendererCocoa::createAudioUnit):
     57        (WebCore::AudioMediaStreamTrackRendererCocoa::pushSamples):
     58        (WebCore::AudioMediaStreamTrackRendererCocoa::render):
     59        (WebCore::AudioMediaStreamTrackRendererCocoa::inputProc):
     60        * platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.h: Added.
     61        * platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.h: Removed.
     62
    1632020-01-06  Jiewen Tan  <jiewen_tan@apple.com>
    264
  • trunk/Source/WebCore/Sources.txt

    r254194 r254446  
    19711971platform/mediarecorder/MediaRecorderPrivateMock.cpp
    19721972
     1973platform/mediastream/AudioMediaStreamTrackRenderer.cpp
     1974platform/mediastream/AudioTrackPrivateMediaStream.cpp
    19731975platform/mediastream/CaptureDeviceManager.cpp
    19741976platform/mediastream/MediaConstraints.cpp
  • trunk/Source/WebCore/SourcesCocoa.txt

    r254064 r254446  
    490490platform/mediastream/ios/CoreAudioCaptureSourceIOS.mm @no-unify
    491491
    492 platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp
     492platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.cpp
    493493platform/mediastream/mac/AVCaptureDeviceManager.mm @no-unify
    494494platform/mediastream/mac/AVVideoCaptureSource.mm @no-unify
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r254373 r254446  
    10011001                372D3E54216578AE00C5E021 /* DataURLDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E4A007821B820EC8002C5A6E /* DataURLDecoder.h */; };
    10021002                372D3E55216578AE00C5E021 /* ScriptModuleLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = E38838951BAD145F00D62EE3 /* ScriptModuleLoader.h */; };
    1003                 372D3E56216578AE00C5E021 /* AudioTrackPrivateMediaStreamCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 07C046C61E42512F007201E7 /* AudioTrackPrivateMediaStreamCocoa.h */; };
    10041003                372D3E57216578AE00C5E021 /* NavigatorCredentials.h in Headers */ = {isa = PBXBuildFile; fileRef = 57D846261FE895F800CA3682 /* NavigatorCredentials.h */; };
    10051004                375CD232119D43C800A2A859 /* Hyphenation.h in Headers */ = {isa = PBXBuildFile; fileRef = 375CD231119D43C800A2A859 /* Hyphenation.h */; };
     
    10871086                4162A451101145AE00DFF3ED /* DedicatedWorkerGlobalScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 4162A44E101145AE00DFF3ED /* DedicatedWorkerGlobalScope.h */; };
    10881087                4162A4581011464700DFF3ED /* JSDedicatedWorkerGlobalScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 4162A4561011464700DFF3ED /* JSDedicatedWorkerGlobalScope.h */; };
     1088                416A06A123CCAD0300347109 /* AudioMediaStreamTrackRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 416A069623CCAA9F00347109 /* AudioMediaStreamTrackRenderer.h */; settings = {ATTRIBUTES = (Private, ); }; };
    10891089                416D75A220C651A500D02D2C /* NetworkLoadInformation.h in Headers */ = {isa = PBXBuildFile; fileRef = 416D759F20C6441300D02D2C /* NetworkLoadInformation.h */; settings = {ATTRIBUTES = (Private, ); }; };
    10901090                416E0B3A209BC3CB004A95D9 /* FetchIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 416E0B37209BC3C2004A95D9 /* FetchIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    54735473                076970851463AD8700F502CF /* TextTrackList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextTrackList.h; sourceTree = "<group>"; };
    54745474                076E11BE1F683E0D00177395 /* TrackPrivateBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrackPrivateBase.cpp; sourceTree = "<group>"; };
    5475                 076EC1321E44F2CB00E5D813 /* AudioTrackPrivateMediaStreamCocoa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioTrackPrivateMediaStreamCocoa.cpp; sourceTree = "<group>"; };
    54765475                076F0D0912B8192700C26AA4 /* MediaPlayerPrivateAVFoundation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaPlayerPrivateAVFoundation.cpp; sourceTree = "<group>"; };
    54775476                076F0D0A12B8192700C26AA4 /* MediaPlayerPrivateAVFoundation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaPlayerPrivateAVFoundation.h; sourceTree = "<group>"; };
     
    55535552                07B93FF923B92AAA0036F8EA /* MIMETypeCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MIMETypeCache.h; sourceTree = "<group>"; };
    55545553                07B93FFB23B92AAB0036F8EA /* MIMETypeCache.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = MIMETypeCache.cpp; sourceTree = "<group>"; };
    5555                 07C046C61E42512F007201E7 /* AudioTrackPrivateMediaStreamCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioTrackPrivateMediaStreamCocoa.h; sourceTree = "<group>"; };
    55565554                07C1C0E01BFB600100BD2256 /* MediaTrackSupportedConstraints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaTrackSupportedConstraints.h; sourceTree = "<group>"; };
    55575555                07C1C0E11BFB600100BD2256 /* MediaTrackSupportedConstraints.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MediaTrackSupportedConstraints.idl; sourceTree = "<group>"; };
     
    73897387                4162A4551011464700DFF3ED /* JSDedicatedWorkerGlobalScope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDedicatedWorkerGlobalScope.cpp; sourceTree = "<group>"; };
    73907388                4162A4561011464700DFF3ED /* JSDedicatedWorkerGlobalScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDedicatedWorkerGlobalScope.h; sourceTree = "<group>"; };
     7389                416A069223CCAA9300347109 /* AudioMediaStreamTrackRendererCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioMediaStreamTrackRendererCocoa.h; sourceTree = "<group>"; };
     7390                416A069323CCAA9400347109 /* AudioMediaStreamTrackRendererCocoa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioMediaStreamTrackRendererCocoa.cpp; sourceTree = "<group>"; };
     7391                416A069423CCAA9E00347109 /* AudioTrackPrivateMediaStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioTrackPrivateMediaStream.cpp; sourceTree = "<group>"; };
     7392                416A069523CCAA9E00347109 /* AudioMediaStreamTrackRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioMediaStreamTrackRenderer.cpp; sourceTree = "<group>"; };
     7393                416A069623CCAA9F00347109 /* AudioMediaStreamTrackRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioMediaStreamTrackRenderer.h; sourceTree = "<group>"; };
    73917394                416CE4A4229DF12E00A8A686 /* RealtimeMediaSourceCenterMac.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RealtimeMediaSourceCenterMac.mm; sourceTree = "<group>"; };
    73927395                416D759F20C6441300D02D2C /* NetworkLoadInformation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkLoadInformation.h; sourceTree = "<group>"; };
     
    1616216165                                415747421E38698000E914D8 /* libwebrtc */,
    1616316166                                0729B14D17CFCCA0004F1D60 /* mac */,
     16167                                416A069523CCAA9E00347109 /* AudioMediaStreamTrackRenderer.cpp */,
     16168                                416A069623CCAA9F00347109 /* AudioMediaStreamTrackRenderer.h */,
     16169                                416A069423CCAA9E00347109 /* AudioTrackPrivateMediaStream.cpp */,
    1616416170                                07D6A4F61BF2307D00174146 /* AudioTrackPrivateMediaStream.h */,
    1616516171                                07B7116A1D899E63009F0FFB /* CaptureDevice.h */,
     
    1623516241                        isa = PBXGroup;
    1623616242                        children = (
    16237                                 076EC1321E44F2CB00E5D813 /* AudioTrackPrivateMediaStreamCocoa.cpp */,
    16238                                 07C046C61E42512F007201E7 /* AudioTrackPrivateMediaStreamCocoa.h */,
     16243                                416A069323CCAA9400347109 /* AudioMediaStreamTrackRendererCocoa.cpp */,
     16244                                416A069223CCAA9300347109 /* AudioMediaStreamTrackRendererCocoa.h */,
    1623916245                                070363DA181A1CDC00C074A5 /* AVCaptureDeviceManager.h */,
    1624016246                                070363DB181A1CDC00C074A5 /* AVCaptureDeviceManager.mm */,
     
    2908529091                                FDE2D55B159E66EB00DCCCF8 /* AudioIOCallback.h in Headers */,
    2908629092                                FD31601012B0267600C1A359 /* AudioListener.h in Headers */,
     29093                                416A06A123CCAD0300347109 /* AudioMediaStreamTrackRenderer.h in Headers */,
    2908729094                                FD31601312B0267600C1A359 /* AudioNode.h in Headers */,
    2908829095                                FD31601612B0267600C1A359 /* AudioNodeInput.h in Headers */,
     
    2911129118                                CD54A763180F9F7000B076C9 /* AudioTrackPrivateMediaSourceAVFObjC.h in Headers */,
    2911229119                                07D6A4F81BF2307D00174146 /* AudioTrackPrivateMediaStream.h in Headers */,
    29113                                 372D3E56216578AE00C5E021 /* AudioTrackPrivateMediaStreamCocoa.h in Headers */,
    2911429120                                FD31608B12B026F700C1A359 /* AudioUtilities.h in Headers */,
    2911529121                                7EE6846112D26E3800E79415 /* AuthenticationChallenge.h in Headers */,
  • trunk/Source/WebCore/platform/audio/mac/AudioSampleDataSource.h

    r247522 r254446  
    4343class CAAudioStreamDescription;
    4444class CARingBuffer;
    45 class MediaStreamTrackPrivate;
    4645
    4746class AudioSampleDataSource : public ThreadSafeRefCounted<AudioSampleDataSource, WTF::DestructionThread::MainRunLoop>
     
    5150    {
    5251public:
    53     static Ref<AudioSampleDataSource> create(size_t, MediaStreamTrackPrivate&);
     52    static Ref<AudioSampleDataSource> create(size_t, WTF::LoggerHelper&);
    5453
    5554    ~AudioSampleDataSource();
     
    8281
    8382private:
    84     AudioSampleDataSource(size_t, MediaStreamTrackPrivate&);
     83    AudioSampleDataSource(size_t, LoggerHelper&);
    8584
    8685    OSStatus setupConverter();
  • trunk/Source/WebCore/platform/audio/mac/AudioSampleDataSource.mm

    r248846 r254446  
    4747using namespace JSC;
    4848
    49 Ref<AudioSampleDataSource> AudioSampleDataSource::create(size_t maximumSampleCount, MediaStreamTrackPrivate& track)
    50 {
    51     return adoptRef(*new AudioSampleDataSource(maximumSampleCount, track));
    52 }
    53 
    54 AudioSampleDataSource::AudioSampleDataSource(size_t maximumSampleCount, MediaStreamTrackPrivate& track)
     49Ref<AudioSampleDataSource> AudioSampleDataSource::create(size_t maximumSampleCount, LoggerHelper& loggerHelper)
     50{
     51    return adoptRef(*new AudioSampleDataSource(maximumSampleCount, loggerHelper));
     52}
     53
     54AudioSampleDataSource::AudioSampleDataSource(size_t maximumSampleCount, LoggerHelper& loggerHelper)
    5555    : m_inputSampleOffset(MediaTime::invalidTime())
    5656    , m_maximumSampleCount(maximumSampleCount)
    5757#if !RELEASE_LOG_DISABLED
    58     , m_logger(track.logger())
    59     , m_logIdentifier(track.logIdentifier())
    60 #endif
    61 {
     58    , m_logger(loggerHelper.logger())
     59    , m_logIdentifier(loggerHelper.logIdentifier())
     60#endif
     61{
     62#if RELEASE_LOG_DISABLED
     63    UNUSED_PARAM(loggerHelper);
     64#endif
    6265}
    6366
  • trunk/Source/WebCore/platform/graphics/TrackPrivateBase.h

    r246490 r254446  
    4949    : public ThreadSafeRefCounted<TrackPrivateBase, WTF::DestructionThread::Main>
    5050#if !RELEASE_LOG_DISABLED
    51     , private LoggerHelper
     51    , public LoggerHelper
    5252#endif
    5353{
     
    7474
    7575#if !RELEASE_LOG_DISABLED
    76     void setLogger(const Logger&, const void*);
     76    virtual void setLogger(const Logger&, const void*);
    7777    const Logger& logger() const final { ASSERT(m_logger); return *m_logger.get(); }
    7878    const void* logIdentifier() const final { return m_logIdentifier; }
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h

    r253693 r254446  
    5252namespace WebCore {
    5353
    54 class AudioTrackPrivateMediaStreamCocoa;
     54class AudioTrackPrivateMediaStream;
    5555class AVVideoCaptureSource;
    5656class MediaSourcePrivateClient;
     
    250250    CurrentFramePainter m_imagePainter;
    251251
    252     HashMap<String, RefPtr<AudioTrackPrivateMediaStreamCocoa>> m_audioTrackMap;
     252    HashMap<String, RefPtr<AudioTrackPrivateMediaStream>> m_audioTrackMap;
    253253    HashMap<String, RefPtr<VideoTrackPrivateMediaStream>> m_videoTrackMap;
    254254    PendingSampleQueue m_pendingVideoSampleQueue;
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm

    r253482 r254446  
    2929#if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
    3030
    31 #import "AudioTrackPrivateMediaStreamCocoa.h"
     31#import "AudioTrackPrivateMediaStream.h"
    3232#import "GraphicsContextCG.h"
    3333#import "Logging.h"
     
    10341034    MediaStreamTrackPrivateVector currentTracks = m_mediaStreamPrivate->tracks();
    10351035
    1036     auto setAudioTrackState = [this](AudioTrackPrivateMediaStreamCocoa& track, int index, TrackState state)
     1036    auto setAudioTrackState = [this](AudioTrackPrivateMediaStream& track, int index, TrackState state)
    10371037    {
    10381038        switch (state) {
     
    10531053        }
    10541054    };
    1055     updateTracksOfType(m_audioTrackMap, RealtimeMediaSource::Type::Audio, currentTracks, &AudioTrackPrivateMediaStreamCocoa::create, WTFMove(setAudioTrackState));
     1055    updateTracksOfType(m_audioTrackMap, RealtimeMediaSource::Type::Audio, currentTracks, &AudioTrackPrivateMediaStream::create, WTFMove(setAudioTrackState));
    10561056
    10571057    auto setVideoTrackState = [this](VideoTrackPrivateMediaStream& track, int index, TrackState state)
  • trunk/Source/WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.cpp

    r254441 r254446  
    11/*
    2  * Copyright (C) 2015-2017 Apple Inc. All rights reserved.
     2 * Copyright (C) 2020 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 #pragma once
     26#include "config.h"
     27#include "AudioMediaStreamTrackRenderer.h"
    2728
    2829#if ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
    2930
    30 #include "AudioTrackPrivate.h"
    31 #include "MediaStreamTrackPrivate.h"
     31#if PLATFORM(COCOA)
     32#include "AudioMediaStreamTrackRendererCocoa.h"
     33#endif
     34
     35namespace WTF {
     36class MediaTime;
     37}
    3238
    3339namespace WebCore {
    3440
    35 class AudioTrackPrivateMediaStream : public AudioTrackPrivate {
    36     WTF_MAKE_NONCOPYABLE(AudioTrackPrivateMediaStream)
    37 public:
    38     static RefPtr<AudioTrackPrivateMediaStream> create(MediaStreamTrackPrivate& streamTrack)
    39     {
    40         return adoptRef(*new AudioTrackPrivateMediaStream(streamTrack));
    41     }
     41AudioMediaStreamTrackRenderer::RendererCreator AudioMediaStreamTrackRenderer::m_rendererCreator = nullptr;
     42void AudioMediaStreamTrackRenderer::setCreator(RendererCreator creator)
     43{
     44    m_rendererCreator = creator;
     45}
    4246
    43     Kind kind() const override { return Kind::Main; }
    44     AtomString id() const override { return m_id; }
    45     AtomString label() const override { return m_label; }
    46     AtomString language() const override { return emptyAtom(); }
    47     int trackIndex() const override { return m_index; }
     47std::unique_ptr<AudioMediaStreamTrackRenderer> AudioMediaStreamTrackRenderer::create()
     48{
     49    if (m_rendererCreator)
     50        return m_rendererCreator();
    4851
    49     void setTrackIndex(int index) { m_index = index; }
     52#if PLATFORM(COCOA)
     53    return makeUnique<AudioMediaStreamTrackRendererCocoa>();
     54#else
     55    return nullptr;
     56#endif
     57}
    5058
    51     MediaStreamTrackPrivate& streamTrack() { return m_streamTrack.get(); }
     59#if !RELEASE_LOG_DISABLED
     60void AudioMediaStreamTrackRenderer::setLogger(const Logger& logger, const void* identifier)
     61{
     62    m_logger = &logger;
     63    m_logIdentifier = identifier;
     64}
    5265
    53     MediaTime timelineOffset() const { return m_timelineOffset; }
    54     void setTimelineOffset(const MediaTime& offset) { m_timelineOffset = offset; }
    55 
    56 protected:
    57     AudioTrackPrivateMediaStream(MediaStreamTrackPrivate& track)
    58         : m_streamTrack(track)
    59         , m_id(track.id())
    60         , m_label(track.label())
    61         , m_timelineOffset(MediaTime::invalidTime())
    62     {
    63     }
    64 
    65     Ref<MediaStreamTrackPrivate> m_streamTrack;
    66     AtomString m_id;
    67     AtomString m_label;
    68     int m_index { 0 };
    69     MediaTime m_timelineOffset;
    70 };
     66WTFLogChannel& AudioMediaStreamTrackRenderer::logChannel() const
     67{
     68    return LogMedia;
     69}
     70#endif
    7171
    7272}
  • trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h

    r246490 r254446  
    3333namespace WebCore {
    3434
    35 class AudioTrackPrivateMediaStream : public AudioTrackPrivate {
     35class AudioMediaStreamTrackRenderer;
     36
     37class AudioTrackPrivateMediaStream final : public AudioTrackPrivate, private MediaStreamTrackPrivate::Observer {
    3638    WTF_MAKE_NONCOPYABLE(AudioTrackPrivateMediaStream)
    3739public:
     
    4042        return adoptRef(*new AudioTrackPrivateMediaStream(streamTrack));
    4143    }
    42 
    43     Kind kind() const override { return Kind::Main; }
    44     AtomString id() const override { return m_id; }
    45     AtomString label() const override { return m_label; }
    46     AtomString language() const override { return emptyAtom(); }
    47     int trackIndex() const override { return m_index; }
     44    ~AudioTrackPrivateMediaStream();
    4845
    4946    void setTrackIndex(int index) { m_index = index; }
     
    5451    void setTimelineOffset(const MediaTime& offset) { m_timelineOffset = offset; }
    5552
     53    void clear();
     54
     55    void play();
     56    void pause();
     57    bool isPlaying() { return m_isPlaying; }
     58
     59    void setVolume(float);
     60    float volume() const;
     61
     62    void setMuted(bool muted) { m_muted = muted; }
     63    bool muted() const { return m_muted; }
     64
     65#if !RELEASE_LOG_DISABLED
     66    void setLogger(const Logger&, const void*) final;
     67    const char* logClassName() const final { return "AudioTrackPrivateMediaStream"; }
     68#endif
     69
    5670protected:
    57     AudioTrackPrivateMediaStream(MediaStreamTrackPrivate& track)
    58         : m_streamTrack(track)
    59         , m_id(track.id())
    60         , m_label(track.label())
    61         , m_timelineOffset(MediaTime::invalidTime())
    62     {
    63     }
     71    explicit AudioTrackPrivateMediaStream(MediaStreamTrackPrivate&);
     72
     73    // AudioTrackPrivate
     74    Kind kind() const final { return Kind::Main; }
     75    AtomString id() const final { return m_id; }
     76    AtomString label() const final { return m_label; }
     77    int trackIndex() const final { return m_index; }
     78
     79    // MediaStreamTrackPrivate::Observer
     80    void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
     81    void trackEnded(MediaStreamTrackPrivate&) final;
     82    void trackMutedChanged(MediaStreamTrackPrivate&)  final;
     83    void trackEnabledChanged(MediaStreamTrackPrivate&)  final;
     84    void trackSettingsChanged(MediaStreamTrackPrivate&) final { }
     85
     86    void playInternal();
     87    void updateRendererMutedState();
     88
     89    // Main thread writable members
     90    bool m_isPlaying { false };
     91    bool m_autoPlay { false };
     92    bool m_muted { false };
     93    bool m_isCleared { false };
    6494
    6595    Ref<MediaStreamTrackPrivate> m_streamTrack;
     
    6898    int m_index { 0 };
    6999    MediaTime m_timelineOffset;
     100
     101    // Audio thread members
     102    std::unique_ptr<AudioMediaStreamTrackRenderer> m_renderer;
     103    bool m_hasStartedAutoplay { false };
    70104};
    71105
  • trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h

    r254194 r254446  
    4848    , public RealtimeMediaSource::Observer
    4949#if !RELEASE_LOG_DISABLED
    50     , private LoggerHelper
     50    , public LoggerHelper
    5151#endif
    5252{
  • trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.cpp

    r254441 r254446  
    11/*
    2  * Copyright (C) 2017 Apple Inc. All rights reserved.
     2 * Copyright (C) 2017-2020 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2525
    2626#include "config.h"
    27 #include "AudioTrackPrivateMediaStreamCocoa.h"
     27#include "AudioMediaStreamTrackRendererCocoa.h"
     28
     29#if ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
    2830
    2931#include "AudioSampleBufferList.h"
     
    3638#include <pal/spi/cocoa/AudioToolboxSPI.h>
    3739
    38 #if ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
    39 
    4040namespace WebCore {
    4141
    42 AudioTrackPrivateMediaStreamCocoa::AudioTrackPrivateMediaStreamCocoa(MediaStreamTrackPrivate& track)
    43     : AudioTrackPrivateMediaStream(track)
    44 {
    45     track.source().addObserver(*this);
    46 }
    47 
    48 AudioTrackPrivateMediaStreamCocoa::~AudioTrackPrivateMediaStreamCocoa()
    49 {
    50     clear();
    51 }
    52 
    53 void AudioTrackPrivateMediaStreamCocoa::clear()
    54 {
    55     if (m_isCleared)
     42AudioMediaStreamTrackRendererCocoa::AudioMediaStreamTrackRendererCocoa() = default;
     43
     44AudioMediaStreamTrackRendererCocoa::~AudioMediaStreamTrackRendererCocoa() = default;
     45
     46void AudioMediaStreamTrackRendererCocoa::stop()
     47{
     48    if (!m_isAudioUnitStarted)
    5649        return;
    5750
    58     m_isCleared = true;
    59     streamTrack().source().removeObserver(*this);
    60 
     51    if (m_remoteIOUnit)
     52        AudioOutputUnitStop(m_remoteIOUnit);
     53}
     54
     55void AudioMediaStreamTrackRendererCocoa::clear()
     56{
    6157    if (m_dataSource)
    6258        m_dataSource->setPaused(true);
     
    7369}
    7470
    75 void AudioTrackPrivateMediaStreamCocoa::playInternal()
    76 {
    77     ASSERT(isMainThread());
    78 
    79     if (m_isPlaying)
    80         return;
    81 
    82     m_isPlaying = true;
    83     m_autoPlay = false;
    84 
     71void AudioMediaStreamTrackRendererCocoa::setPaused(bool value)
     72{
     73    m_paused = value;
    8574    if (m_dataSource)
    86         m_dataSource->setPaused(false);
    87 }
    88 
    89 void AudioTrackPrivateMediaStreamCocoa::play()
    90 {
    91     playInternal();
    92 }
    93 
    94 void AudioTrackPrivateMediaStreamCocoa::pause()
    95 {
    96     ASSERT(isMainThread());
    97 
    98     if (!m_isPlaying)
    99         return;
    100 
    101     m_isPlaying = false;
    102     m_autoPlay = false;
    103 
    104     if (m_dataSource)
    105         m_dataSource->setPaused(true);
    106 }
    107 
    108 void AudioTrackPrivateMediaStreamCocoa::setVolume(float volume)
    109 {
    110     m_volume = volume;
    111     if (m_dataSource)
    112         m_dataSource->setVolume(m_volume);
    113 }
    114 
    115 AudioComponentInstance AudioTrackPrivateMediaStreamCocoa::createAudioUnit(CAAudioStreamDescription& outputDescription)
     75        m_dataSource->setPaused(value);
     76}
     77
     78AudioComponentInstance AudioMediaStreamTrackRendererCocoa::createAudioUnit(CAAudioStreamDescription& outputDescription)
    11679{
    11780    AudioComponentInstance remoteIOUnit { nullptr };
     
    178141
    179142// May get called on a background thread.
    180 void AudioTrackPrivateMediaStreamCocoa::audioSamplesAvailable(const MediaTime& sampleTime, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t sampleCount)
     143void AudioMediaStreamTrackRendererCocoa::pushSamples(const MediaTime& sampleTime, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t sampleCount)
    181144{
    182145    ASSERT(description.platformDescription().type == PlatformDescription::CAAudioStreamBasicType);
    183 
    184     if (!m_isPlaying) {
    185         if (m_isAudioUnitStarted) {
    186             if (m_remoteIOUnit)
    187                 AudioOutputUnitStop(m_remoteIOUnit);
    188             m_isAudioUnitStarted = false;
    189         }
    190         return;
    191     }
    192146
    193147    if (!m_inputDescription || *m_inputDescription != description) {
     
    213167        m_outputDescription = makeUnique<CAAudioStreamDescription>(outputDescription);
    214168
    215         m_dataSource = AudioSampleDataSource::create(description.sampleRate() * 2, streamTrack());
     169        m_dataSource = AudioSampleDataSource::create(description.sampleRate() * 2, *this);
    216170
    217171        if (m_dataSource->setInputFormat(inputDescription) || m_dataSource->setOutputFormat(outputDescription)) {
     
    229183        m_isAudioUnitStarted = true;
    230184
    231         m_dataSource->setVolume(m_volume);
     185        m_dataSource->setVolume(volume());
    232186        m_remoteIOUnit = remoteIOUnit;
    233187    }
    234188
    235189    m_dataSource->pushSamples(sampleTime, audioData, sampleCount);
    236 
    237     if (m_autoPlay && !m_hasStartedAutoplay) {
    238         m_hasStartedAutoplay = true;
    239         callOnMainThread([this, protectedThis = makeRef(*this)] {
    240             if (m_autoPlay)
    241                 playInternal();
    242         });
    243     }
    244190
    245191    if (!m_isAudioUnitStarted) {
     
    252198}
    253199
    254 void AudioTrackPrivateMediaStreamCocoa::sourceStopped()
    255 {
    256     pause();
    257 }
    258 
    259 OSStatus AudioTrackPrivateMediaStreamCocoa::render(UInt32 sampleCount, AudioBufferList& ioData, UInt32 /*inBusNumber*/, const AudioTimeStamp& timeStamp, AudioUnitRenderActionFlags& actionFlags)
    260 {
    261     // This function is called on a high-priority background thread. The following protectedThis object ensures the object is not
    262     // destroyed on the main thread before this function exits.
    263     Ref<AudioTrackPrivateMediaStreamCocoa> protectedThis { *this };
    264 
    265     if (!m_isPlaying || m_muted || !m_dataSource || streamTrack().muted() || streamTrack().ended() || !streamTrack().enabled()) {
     200OSStatus AudioMediaStreamTrackRendererCocoa::render(UInt32 sampleCount, AudioBufferList& ioData, UInt32 /*inBusNumber*/, const AudioTimeStamp& timeStamp, AudioUnitRenderActionFlags& actionFlags)
     201{
     202    if (isMuted() || m_paused || !m_dataSource) {
    266203        AudioSampleBufferList::zeroABL(ioData, static_cast<size_t>(sampleCount * m_outputDescription->bytesPerFrame()));
    267204        actionFlags = kAudioUnitRenderAction_OutputIsSilence;
     
    274211}
    275212
    276 OSStatus AudioTrackPrivateMediaStreamCocoa::inputProc(void* userData, AudioUnitRenderActionFlags* actionFlags, const AudioTimeStamp* timeStamp, UInt32 inBusNumber, UInt32 sampleCount, AudioBufferList* ioData)
    277 {
    278     return static_cast<AudioTrackPrivateMediaStreamCocoa*>(userData)->render(sampleCount, *ioData, inBusNumber, *timeStamp, *actionFlags);
     213OSStatus AudioMediaStreamTrackRendererCocoa::inputProc(void* userData, AudioUnitRenderActionFlags* actionFlags, const AudioTimeStamp* timeStamp, UInt32 inBusNumber, UInt32 sampleCount, AudioBufferList* ioData)
     214{
     215    return static_cast<AudioMediaStreamTrackRendererCocoa*>(userData)->render(sampleCount, *ioData, inBusNumber, *timeStamp, *actionFlags);
    279216}
    280217
  • trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.h

    r254441 r254446  
    2828#if ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
    2929
    30 #include "AudioTrackPrivateMediaStream.h"
     30#include "AudioMediaStreamTrackRenderer.h"
     31#include "Logging.h"
     32
    3133#include <AudioToolbox/AudioToolbox.h>
    3234#include <CoreAudio/CoreAudioTypes.h>
     
    3840class CAAudioStreamDescription;
    3941
    40 class AudioTrackPrivateMediaStreamCocoa final : public AudioTrackPrivateMediaStream, private RealtimeMediaSource::Observer {
    41     WTF_MAKE_NONCOPYABLE(AudioTrackPrivateMediaStreamCocoa)
     42class AudioMediaStreamTrackRendererCocoa : public AudioMediaStreamTrackRenderer {
     43    WTF_MAKE_FAST_ALLOCATED;
    4244public:
    43     static RefPtr<AudioTrackPrivateMediaStreamCocoa> create(MediaStreamTrackPrivate& streamTrack)
    44     {
    45         return adoptRef(*new AudioTrackPrivateMediaStreamCocoa(streamTrack));
    46     }
    47 
    48     void clear();
    49 
    50     void play();
    51     void pause();
    52     bool isPlaying() { return m_isPlaying; }
    53 
    54     void setVolume(float);
    55     float volume() const { return m_volume; }
    56 
    57     void setMuted(bool muted) { m_muted = muted; }
    58     bool muted() const { return m_muted; }
     45    AudioMediaStreamTrackRendererCocoa();
     46    ~AudioMediaStreamTrackRendererCocoa();
    5947
    6048private:
    61     AudioTrackPrivateMediaStreamCocoa(MediaStreamTrackPrivate&);
    62     ~AudioTrackPrivateMediaStreamCocoa();
    63 
    64     // RealtimeMediaSource::Observer
    65     void sourceStopped() final;
    66     void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
     49    // AudioMediaStreamTrackRenderer
     50    void pushSamples(const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
     51    void stop() final;
     52    void clear() final;
     53    void setPaused(bool) final;
    6754
    6855    static OSStatus inputProc(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32 inBusNumber, UInt32 numberOfFrames, AudioBufferList*);
     
    7057
    7158    AudioComponentInstance createAudioUnit(CAAudioStreamDescription&);
    72     void cleanup();
    73     void zeroBufferList(AudioBufferList&, size_t);
    74     void playInternal();
    75 
    76 #if !RELEASE_LOG_DISABLED
    77     const char* logClassName() const final { return "AudioTrackPrivateMediaStreamCocoa"; }
    78 #endif
    7959
    8060    // Audio thread members
     
    8262    std::unique_ptr<CAAudioStreamDescription> m_inputDescription;
    8363    std::unique_ptr<CAAudioStreamDescription> m_outputDescription;
    84     bool m_isAudioUnitStarted { false };
    85     bool m_hasStartedAutoplay { false };
    8664
    8765    // Cross thread members
    8866    RefPtr<AudioSampleDataSource> m_dataSource;
    89 
    90     // Main thread writable members
    91     float m_volume { 1 };
    92     bool m_isPlaying { false };
    93     bool m_autoPlay { false };
    94     bool m_muted { false };
    95     bool m_isCleared { false };
     67    bool m_isAudioUnitStarted { false };
     68    bool m_paused { false };
    9669};
    9770
Note: See TracChangeset for help on using the changeset viewer.