Diff
Modified: trunk/Source/WebCore/ChangeLog (254445 => 254446)
--- trunk/Source/WebCore/ChangeLog 2020-01-13 19:57:39 UTC (rev 254445)
+++ trunk/Source/WebCore/ChangeLog 2020-01-13 20:21:23 UTC (rev 254446)
@@ -1,3 +1,65 @@
+2020-01-13 youenn fablet <[email protected]>
+
+ 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.
+
2020-01-06 Jiewen Tan <[email protected]>
[WebAuthn] Support CTAP Client Pin
Modified: trunk/Source/WebCore/Sources.txt (254445 => 254446)
--- trunk/Source/WebCore/Sources.txt 2020-01-13 19:57:39 UTC (rev 254445)
+++ trunk/Source/WebCore/Sources.txt 2020-01-13 20:21:23 UTC (rev 254446)
@@ -1970,6 +1970,8 @@
platform/mediarecorder/MediaRecorderPrivateMock.cpp
+platform/mediastream/AudioMediaStreamTrackRenderer.cpp
+platform/mediastream/AudioTrackPrivateMediaStream.cpp
platform/mediastream/CaptureDeviceManager.cpp
platform/mediastream/MediaConstraints.cpp
platform/mediastream/MediaEndpointConfiguration.cpp
Modified: trunk/Source/WebCore/SourcesCocoa.txt (254445 => 254446)
--- trunk/Source/WebCore/SourcesCocoa.txt 2020-01-13 19:57:39 UTC (rev 254445)
+++ trunk/Source/WebCore/SourcesCocoa.txt 2020-01-13 20:21:23 UTC (rev 254446)
@@ -489,7 +489,7 @@
platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.mm @no-unify
platform/mediastream/ios/CoreAudioCaptureSourceIOS.mm @no-unify
-platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp
+platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.cpp
platform/mediastream/mac/AVCaptureDeviceManager.mm @no-unify
platform/mediastream/mac/AVVideoCaptureSource.mm @no-unify
platform/mediastream/mac/MockRealtimeVideoSourceMac.mm
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (254445 => 254446)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2020-01-13 19:57:39 UTC (rev 254445)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2020-01-13 20:21:23 UTC (rev 254446)
@@ -1000,7 +1000,6 @@
372C00D9129619F8005C9575 /* FindOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 372C00D8129619F8005C9575 /* FindOptions.h */; settings = {ATTRIBUTES = (Private, ); }; };
372D3E54216578AE00C5E021 /* DataURLDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E4A007821B820EC8002C5A6E /* DataURLDecoder.h */; };
372D3E55216578AE00C5E021 /* ScriptModuleLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = E38838951BAD145F00D62EE3 /* ScriptModuleLoader.h */; };
- 372D3E56216578AE00C5E021 /* AudioTrackPrivateMediaStreamCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 07C046C61E42512F007201E7 /* AudioTrackPrivateMediaStreamCocoa.h */; };
372D3E57216578AE00C5E021 /* NavigatorCredentials.h in Headers */ = {isa = PBXBuildFile; fileRef = 57D846261FE895F800CA3682 /* NavigatorCredentials.h */; };
375CD232119D43C800A2A859 /* Hyphenation.h in Headers */ = {isa = PBXBuildFile; fileRef = 375CD231119D43C800A2A859 /* Hyphenation.h */; };
3774ABA50FA21EB400AD7DE9 /* OverlapTestRequestClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 3774ABA30FA21EB400AD7DE9 /* OverlapTestRequestClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -1086,6 +1085,7 @@
4161E2D51FE48DC500EC2E96 /* FetchLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 4147E2B51C89912600A7E715 /* FetchLoader.h */; settings = {ATTRIBUTES = (Private, ); }; };
4162A451101145AE00DFF3ED /* DedicatedWorkerGlobalScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 4162A44E101145AE00DFF3ED /* DedicatedWorkerGlobalScope.h */; };
4162A4581011464700DFF3ED /* JSDedicatedWorkerGlobalScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 4162A4561011464700DFF3ED /* JSDedicatedWorkerGlobalScope.h */; };
+ 416A06A123CCAD0300347109 /* AudioMediaStreamTrackRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 416A069623CCAA9F00347109 /* AudioMediaStreamTrackRenderer.h */; settings = {ATTRIBUTES = (Private, ); }; };
416D75A220C651A500D02D2C /* NetworkLoadInformation.h in Headers */ = {isa = PBXBuildFile; fileRef = 416D759F20C6441300D02D2C /* NetworkLoadInformation.h */; settings = {ATTRIBUTES = (Private, ); }; };
416E0B3A209BC3CB004A95D9 /* FetchIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 416E0B37209BC3C2004A95D9 /* FetchIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
416E29A6102FA962007FC14E /* WorkerReportingProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 416E29A5102FA962007FC14E /* WorkerReportingProxy.h */; };
@@ -5472,7 +5472,6 @@
076970841463AD8700F502CF /* TextTrackList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextTrackList.cpp; sourceTree = "<group>"; };
076970851463AD8700F502CF /* TextTrackList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextTrackList.h; sourceTree = "<group>"; };
076E11BE1F683E0D00177395 /* TrackPrivateBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrackPrivateBase.cpp; sourceTree = "<group>"; };
- 076EC1321E44F2CB00E5D813 /* AudioTrackPrivateMediaStreamCocoa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioTrackPrivateMediaStreamCocoa.cpp; sourceTree = "<group>"; };
076F0D0912B8192700C26AA4 /* MediaPlayerPrivateAVFoundation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaPlayerPrivateAVFoundation.cpp; sourceTree = "<group>"; };
076F0D0A12B8192700C26AA4 /* MediaPlayerPrivateAVFoundation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaPlayerPrivateAVFoundation.h; sourceTree = "<group>"; };
077664FA183E6B5C00133B92 /* JSQuickTimePluginReplacement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSQuickTimePluginReplacement.cpp; sourceTree = "<group>"; };
@@ -5552,7 +5551,6 @@
07B7116C1D899E63009F0FFB /* CaptureDeviceManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CaptureDeviceManager.h; sourceTree = "<group>"; };
07B93FF923B92AAA0036F8EA /* MIMETypeCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MIMETypeCache.h; sourceTree = "<group>"; };
07B93FFB23B92AAB0036F8EA /* MIMETypeCache.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = MIMETypeCache.cpp; sourceTree = "<group>"; };
- 07C046C61E42512F007201E7 /* AudioTrackPrivateMediaStreamCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioTrackPrivateMediaStreamCocoa.h; sourceTree = "<group>"; };
07C1C0E01BFB600100BD2256 /* MediaTrackSupportedConstraints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaTrackSupportedConstraints.h; sourceTree = "<group>"; };
07C1C0E11BFB600100BD2256 /* MediaTrackSupportedConstraints.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MediaTrackSupportedConstraints.idl; sourceTree = "<group>"; };
07C1C0E41BFB60ED00BD2256 /* RealtimeMediaSourceSupportedConstraints.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RealtimeMediaSourceSupportedConstraints.h; sourceTree = "<group>"; };
@@ -7388,6 +7386,11 @@
4162A44F101145AE00DFF3ED /* DedicatedWorkerGlobalScope.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DedicatedWorkerGlobalScope.idl; sourceTree = "<group>"; };
4162A4551011464700DFF3ED /* JSDedicatedWorkerGlobalScope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDedicatedWorkerGlobalScope.cpp; sourceTree = "<group>"; };
4162A4561011464700DFF3ED /* JSDedicatedWorkerGlobalScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDedicatedWorkerGlobalScope.h; sourceTree = "<group>"; };
+ 416A069223CCAA9300347109 /* AudioMediaStreamTrackRendererCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioMediaStreamTrackRendererCocoa.h; sourceTree = "<group>"; };
+ 416A069323CCAA9400347109 /* AudioMediaStreamTrackRendererCocoa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioMediaStreamTrackRendererCocoa.cpp; sourceTree = "<group>"; };
+ 416A069423CCAA9E00347109 /* AudioTrackPrivateMediaStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioTrackPrivateMediaStream.cpp; sourceTree = "<group>"; };
+ 416A069523CCAA9E00347109 /* AudioMediaStreamTrackRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioMediaStreamTrackRenderer.cpp; sourceTree = "<group>"; };
+ 416A069623CCAA9F00347109 /* AudioMediaStreamTrackRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioMediaStreamTrackRenderer.h; sourceTree = "<group>"; };
416CE4A4229DF12E00A8A686 /* RealtimeMediaSourceCenterMac.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RealtimeMediaSourceCenterMac.mm; sourceTree = "<group>"; };
416D759F20C6441300D02D2C /* NetworkLoadInformation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkLoadInformation.h; sourceTree = "<group>"; };
416E0B37209BC3C2004A95D9 /* FetchIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FetchIdentifier.h; sourceTree = "<group>"; };
@@ -16161,6 +16164,9 @@
CDC6751F1EAEA99600727C84 /* ios */,
415747421E38698000E914D8 /* libwebrtc */,
0729B14D17CFCCA0004F1D60 /* mac */,
+ 416A069523CCAA9E00347109 /* AudioMediaStreamTrackRenderer.cpp */,
+ 416A069623CCAA9F00347109 /* AudioMediaStreamTrackRenderer.h */,
+ 416A069423CCAA9E00347109 /* AudioTrackPrivateMediaStream.cpp */,
07D6A4F61BF2307D00174146 /* AudioTrackPrivateMediaStream.h */,
07B7116A1D899E63009F0FFB /* CaptureDevice.h */,
07B7116B1D899E63009F0FFB /* CaptureDeviceManager.cpp */,
@@ -16234,8 +16240,8 @@
0729B14D17CFCCA0004F1D60 /* mac */ = {
isa = PBXGroup;
children = (
- 076EC1321E44F2CB00E5D813 /* AudioTrackPrivateMediaStreamCocoa.cpp */,
- 07C046C61E42512F007201E7 /* AudioTrackPrivateMediaStreamCocoa.h */,
+ 416A069323CCAA9400347109 /* AudioMediaStreamTrackRendererCocoa.cpp */,
+ 416A069223CCAA9300347109 /* AudioMediaStreamTrackRendererCocoa.h */,
070363DA181A1CDC00C074A5 /* AVCaptureDeviceManager.h */,
070363DB181A1CDC00C074A5 /* AVCaptureDeviceManager.mm */,
070363DE181A1CDC00C074A5 /* AVVideoCaptureSource.h */,
@@ -29084,6 +29090,7 @@
CD2F4A2818D8A3490063746D /* AudioHardwareListenerMac.h in Headers */,
FDE2D55B159E66EB00DCCCF8 /* AudioIOCallback.h in Headers */,
FD31601012B0267600C1A359 /* AudioListener.h in Headers */,
+ 416A06A123CCAD0300347109 /* AudioMediaStreamTrackRenderer.h in Headers */,
FD31601312B0267600C1A359 /* AudioNode.h in Headers */,
FD31601612B0267600C1A359 /* AudioNodeInput.h in Headers */,
FD31601812B0267600C1A359 /* AudioNodeOutput.h in Headers */,
@@ -29110,7 +29117,6 @@
CDE3A85817F6020400C5BE20 /* AudioTrackPrivateAVFObjC.h in Headers */,
CD54A763180F9F7000B076C9 /* AudioTrackPrivateMediaSourceAVFObjC.h in Headers */,
07D6A4F81BF2307D00174146 /* AudioTrackPrivateMediaStream.h in Headers */,
- 372D3E56216578AE00C5E021 /* AudioTrackPrivateMediaStreamCocoa.h in Headers */,
FD31608B12B026F700C1A359 /* AudioUtilities.h in Headers */,
7EE6846112D26E3800E79415 /* AuthenticationChallenge.h in Headers */,
934F713A0D5A6F1000018D69 /* AuthenticationChallengeBase.h in Headers */,
Modified: trunk/Source/WebCore/platform/audio/mac/AudioSampleDataSource.h (254445 => 254446)
--- trunk/Source/WebCore/platform/audio/mac/AudioSampleDataSource.h 2020-01-13 19:57:39 UTC (rev 254445)
+++ trunk/Source/WebCore/platform/audio/mac/AudioSampleDataSource.h 2020-01-13 20:21:23 UTC (rev 254446)
@@ -42,7 +42,6 @@
class CAAudioStreamDescription;
class CARingBuffer;
-class MediaStreamTrackPrivate;
class AudioSampleDataSource : public ThreadSafeRefCounted<AudioSampleDataSource, WTF::DestructionThread::MainRunLoop>
#if !RELEASE_LOG_DISABLED
@@ -50,7 +49,7 @@
#endif
{
public:
- static Ref<AudioSampleDataSource> create(size_t, MediaStreamTrackPrivate&);
+ static Ref<AudioSampleDataSource> create(size_t, WTF::LoggerHelper&);
~AudioSampleDataSource();
@@ -81,7 +80,7 @@
#endif
private:
- AudioSampleDataSource(size_t, MediaStreamTrackPrivate&);
+ AudioSampleDataSource(size_t, LoggerHelper&);
OSStatus setupConverter();
bool pullSamplesInternal(AudioBufferList&, size_t&, uint64_t, double, PullMode);
Modified: trunk/Source/WebCore/platform/audio/mac/AudioSampleDataSource.mm (254445 => 254446)
--- trunk/Source/WebCore/platform/audio/mac/AudioSampleDataSource.mm 2020-01-13 19:57:39 UTC (rev 254445)
+++ trunk/Source/WebCore/platform/audio/mac/AudioSampleDataSource.mm 2020-01-13 20:21:23 UTC (rev 254446)
@@ -46,19 +46,22 @@
using namespace PAL;
using namespace JSC;
-Ref<AudioSampleDataSource> AudioSampleDataSource::create(size_t maximumSampleCount, MediaStreamTrackPrivate& track)
+Ref<AudioSampleDataSource> AudioSampleDataSource::create(size_t maximumSampleCount, LoggerHelper& loggerHelper)
{
- return adoptRef(*new AudioSampleDataSource(maximumSampleCount, track));
+ return adoptRef(*new AudioSampleDataSource(maximumSampleCount, loggerHelper));
}
-AudioSampleDataSource::AudioSampleDataSource(size_t maximumSampleCount, MediaStreamTrackPrivate& track)
+AudioSampleDataSource::AudioSampleDataSource(size_t maximumSampleCount, LoggerHelper& loggerHelper)
: m_inputSampleOffset(MediaTime::invalidTime())
, m_maximumSampleCount(maximumSampleCount)
#if !RELEASE_LOG_DISABLED
- , m_logger(track.logger())
- , m_logIdentifier(track.logIdentifier())
+ , m_logger(loggerHelper.logger())
+ , m_logIdentifier(loggerHelper.logIdentifier())
#endif
{
+#if RELEASE_LOG_DISABLED
+ UNUSED_PARAM(loggerHelper);
+#endif
}
AudioSampleDataSource::~AudioSampleDataSource()
Modified: trunk/Source/WebCore/platform/graphics/TrackPrivateBase.h (254445 => 254446)
--- trunk/Source/WebCore/platform/graphics/TrackPrivateBase.h 2020-01-13 19:57:39 UTC (rev 254445)
+++ trunk/Source/WebCore/platform/graphics/TrackPrivateBase.h 2020-01-13 20:21:23 UTC (rev 254446)
@@ -48,7 +48,7 @@
class TrackPrivateBase
: public ThreadSafeRefCounted<TrackPrivateBase, WTF::DestructionThread::Main>
#if !RELEASE_LOG_DISABLED
- , private LoggerHelper
+ , public LoggerHelper
#endif
{
WTF_MAKE_NONCOPYABLE(TrackPrivateBase);
@@ -73,7 +73,7 @@
}
#if !RELEASE_LOG_DISABLED
- void setLogger(const Logger&, const void*);
+ virtual void setLogger(const Logger&, const void*);
const Logger& logger() const final { ASSERT(m_logger); return *m_logger.get(); }
const void* logIdentifier() const final { return m_logIdentifier; }
WTFLogChannel& logChannel() const final;
Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h (254445 => 254446)
--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h 2020-01-13 19:57:39 UTC (rev 254445)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h 2020-01-13 20:21:23 UTC (rev 254446)
@@ -51,7 +51,7 @@
namespace WebCore {
-class AudioTrackPrivateMediaStreamCocoa;
+class AudioTrackPrivateMediaStream;
class AVVideoCaptureSource;
class MediaSourcePrivateClient;
class PixelBufferConformerCV;
@@ -249,7 +249,7 @@
};
CurrentFramePainter m_imagePainter;
- HashMap<String, RefPtr<AudioTrackPrivateMediaStreamCocoa>> m_audioTrackMap;
+ HashMap<String, RefPtr<AudioTrackPrivateMediaStream>> m_audioTrackMap;
HashMap<String, RefPtr<VideoTrackPrivateMediaStream>> m_videoTrackMap;
PendingSampleQueue m_pendingVideoSampleQueue;
Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (254445 => 254446)
--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm 2020-01-13 19:57:39 UTC (rev 254445)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm 2020-01-13 20:21:23 UTC (rev 254446)
@@ -28,7 +28,7 @@
#if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
-#import "AudioTrackPrivateMediaStreamCocoa.h"
+#import "AudioTrackPrivateMediaStream.h"
#import "GraphicsContextCG.h"
#import "Logging.h"
#import "MediaStreamPrivate.h"
@@ -1033,7 +1033,7 @@
{
MediaStreamTrackPrivateVector currentTracks = m_mediaStreamPrivate->tracks();
- auto setAudioTrackState = [this](AudioTrackPrivateMediaStreamCocoa& track, int index, TrackState state)
+ auto setAudioTrackState = [this](AudioTrackPrivateMediaStream& track, int index, TrackState state)
{
switch (state) {
case TrackState::Remove:
@@ -1052,7 +1052,7 @@
break;
}
};
- updateTracksOfType(m_audioTrackMap, RealtimeMediaSource::Type::Audio, currentTracks, &AudioTrackPrivateMediaStreamCocoa::create, WTFMove(setAudioTrackState));
+ updateTracksOfType(m_audioTrackMap, RealtimeMediaSource::Type::Audio, currentTracks, &AudioTrackPrivateMediaStream::create, WTFMove(setAudioTrackState));
auto setVideoTrackState = [this](VideoTrackPrivateMediaStream& track, int index, TrackState state)
{
Copied: trunk/Source/WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.cpp (from rev 254441, trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h) (0 => 254446)
--- trunk/Source/WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.cpp (rev 0)
+++ trunk/Source/WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.cpp 2020-01-13 20:21:23 UTC (rev 254446)
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2020 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "AudioMediaStreamTrackRenderer.h"
+
+#if ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
+
+#if PLATFORM(COCOA)
+#include "AudioMediaStreamTrackRendererCocoa.h"
+#endif
+
+namespace WTF {
+class MediaTime;
+}
+
+namespace WebCore {
+
+AudioMediaStreamTrackRenderer::RendererCreator AudioMediaStreamTrackRenderer::m_rendererCreator = nullptr;
+void AudioMediaStreamTrackRenderer::setCreator(RendererCreator creator)
+{
+ m_rendererCreator = creator;
+}
+
+std::unique_ptr<AudioMediaStreamTrackRenderer> AudioMediaStreamTrackRenderer::create()
+{
+ if (m_rendererCreator)
+ return m_rendererCreator();
+
+#if PLATFORM(COCOA)
+ return makeUnique<AudioMediaStreamTrackRendererCocoa>();
+#else
+ return nullptr;
+#endif
+}
+
+#if !RELEASE_LOG_DISABLED
+void AudioMediaStreamTrackRenderer::setLogger(const Logger& logger, const void* identifier)
+{
+ m_logger = &logger;
+ m_logIdentifier = identifier;
+}
+
+WTFLogChannel& AudioMediaStreamTrackRenderer::logChannel() const
+{
+ return LogMedia;
+}
+#endif
+
+}
+
+#endif // ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
Added: trunk/Source/WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.h (0 => 254446)
--- trunk/Source/WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.h (rev 0)
+++ trunk/Source/WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.h 2020-01-13 20:21:23 UTC (rev 254446)
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2020 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
+
+#include <wtf/LoggerHelper.h>
+
+namespace WTF {
+class MediaTime;
+}
+
+namespace WebCore {
+
+class AudioStreamDescription;
+class PlatformAudioData;
+
+class WEBCORE_EXPORT AudioMediaStreamTrackRenderer : public LoggerHelper {
+ WTF_MAKE_FAST_ALLOCATED;
+public:
+ static std::unique_ptr<AudioMediaStreamTrackRenderer> create();
+ virtual ~AudioMediaStreamTrackRenderer() = default;
+
+ virtual void setPaused(bool) = 0;
+ virtual void stop() = 0;
+ virtual void clear() = 0;
+ // May be called on a background thread.
+ virtual void pushSamples(const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) = 0;
+
+ virtual void setMuted(bool);
+ virtual void setVolume(float);
+ float volume() const;
+
+#if !RELEASE_LOG_DISABLED
+ void setLogger(const Logger&, const void*);
+#endif
+
+ using RendererCreator = std::unique_ptr<AudioMediaStreamTrackRenderer> (*)();
+ static void setCreator(RendererCreator);
+
+protected:
+#if !RELEASE_LOG_DISABLED
+ const Logger& logger() const final;
+ const void* logIdentifier() const final;
+
+ const char* logClassName() const final;
+ WTFLogChannel& logChannel() const final;
+#endif
+
+ bool isMuted() const;
+
+private:
+ static RendererCreator m_rendererCreator;
+
+ // Main thread writable members
+ bool m_muted { false };
+ float m_volume { 1 };
+
+#if !RELEASE_LOG_DISABLED
+ RefPtr<const Logger> m_logger;
+ const void* m_logIdentifier;
+#endif
+};
+
+inline void AudioMediaStreamTrackRenderer::setMuted(bool value)
+{
+ m_muted = value;
+}
+
+inline void AudioMediaStreamTrackRenderer::setVolume(float volume)
+{
+ m_volume = volume;
+}
+
+inline float AudioMediaStreamTrackRenderer::volume() const
+{
+ return m_volume;
+}
+
+
+inline bool AudioMediaStreamTrackRenderer::isMuted() const
+{
+ return m_muted;
+}
+
+#if !RELEASE_LOG_DISABLED
+inline const Logger& AudioMediaStreamTrackRenderer::logger() const
+{
+ return *m_logger;
+
+}
+
+inline const void* AudioMediaStreamTrackRenderer::logIdentifier() const
+{
+ return m_logIdentifier;
+}
+
+inline const char* AudioMediaStreamTrackRenderer::logClassName() const
+{
+ return "AudioMediaStreamTrackRenderer";
+}
+#endif
+
+}
+
+#endif // ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
Added: trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp (0 => 254446)
--- trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp (rev 0)
+++ trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp 2020-01-13 20:21:23 UTC (rev 254446)
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2017-2020 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "AudioTrackPrivateMediaStream.h"
+
+#if ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
+
+#include "AudioMediaStreamTrackRenderer.h"
+#include "Logging.h"
+
+namespace WebCore {
+
+AudioTrackPrivateMediaStream::AudioTrackPrivateMediaStream(MediaStreamTrackPrivate& track)
+ : m_streamTrack(track)
+ , m_id(track.id())
+ , m_label(track.label())
+ , m_timelineOffset(MediaTime::invalidTime())
+ , m_renderer { AudioMediaStreamTrackRenderer::create() }
+{
+ track.addObserver(*this);
+}
+
+AudioTrackPrivateMediaStream::~AudioTrackPrivateMediaStream()
+{
+ clear();
+}
+
+#if !RELEASE_LOG_DISABLED
+void AudioTrackPrivateMediaStream::setLogger(const Logger& logger, const void* identifier)
+{
+ TrackPrivateBase::setLogger(logger, identifier);
+ m_renderer->setLogger(logger, identifier);
+}
+#endif
+
+void AudioTrackPrivateMediaStream::clear()
+{
+ if (m_isCleared)
+ return;
+
+ m_isCleared = true;
+ streamTrack().removeObserver(*this);
+
+ m_renderer->clear();
+}
+
+void AudioTrackPrivateMediaStream::playInternal()
+{
+ ASSERT(isMainThread());
+
+ if (m_isPlaying)
+ return;
+
+ m_isPlaying = true;
+ m_autoPlay = false;
+
+ m_renderer->setPaused(false);
+}
+
+void AudioTrackPrivateMediaStream::play()
+{
+ playInternal();
+}
+
+void AudioTrackPrivateMediaStream::pause()
+{
+ ASSERT(isMainThread());
+
+ if (!m_isPlaying)
+ return;
+
+ m_isPlaying = false;
+ m_autoPlay = false;
+
+ m_renderer->setPaused(true);
+}
+
+void AudioTrackPrivateMediaStream::setVolume(float volume)
+{
+ m_renderer->setVolume(volume);
+}
+
+float AudioTrackPrivateMediaStream::volume() const
+{
+ return m_renderer->volume();
+}
+
+// May get called on a background thread.
+void AudioTrackPrivateMediaStream::audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime& sampleTime, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t sampleCount)
+{
+ if (!m_isPlaying) {
+ m_renderer->stop();
+ return;
+ }
+
+ m_renderer->pushSamples(sampleTime, audioData, description, sampleCount);
+
+ if (m_autoPlay && !m_hasStartedAutoplay) {
+ m_hasStartedAutoplay = true;
+ callOnMainThread([this, protectedThis = makeRef(*this)] {
+ if (m_autoPlay)
+ playInternal();
+ });
+ }
+}
+
+void AudioTrackPrivateMediaStream::trackMutedChanged(MediaStreamTrackPrivate&)
+{
+ updateRendererMutedState();
+}
+
+void AudioTrackPrivateMediaStream::trackEnabledChanged(MediaStreamTrackPrivate&)
+{
+ updateRendererMutedState();
+}
+
+void AudioTrackPrivateMediaStream::updateRendererMutedState()
+{
+ m_renderer->setMuted(m_isPlaying && !streamTrack().muted() && !streamTrack().ended() && streamTrack().enabled());
+}
+
+void AudioTrackPrivateMediaStream::trackEnded(MediaStreamTrackPrivate&)
+{
+ pause();
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
Modified: trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h (254445 => 254446)
--- trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h 2020-01-13 19:57:39 UTC (rev 254445)
+++ trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h 2020-01-13 20:21:23 UTC (rev 254446)
@@ -32,7 +32,9 @@
namespace WebCore {
-class AudioTrackPrivateMediaStream : public AudioTrackPrivate {
+class AudioMediaStreamTrackRenderer;
+
+class AudioTrackPrivateMediaStream final : public AudioTrackPrivate, private MediaStreamTrackPrivate::Observer {
WTF_MAKE_NONCOPYABLE(AudioTrackPrivateMediaStream)
public:
static RefPtr<AudioTrackPrivateMediaStream> create(MediaStreamTrackPrivate& streamTrack)
@@ -39,13 +41,8 @@
{
return adoptRef(*new AudioTrackPrivateMediaStream(streamTrack));
}
+ ~AudioTrackPrivateMediaStream();
- Kind kind() const override { return Kind::Main; }
- AtomString id() const override { return m_id; }
- AtomString label() const override { return m_label; }
- AtomString language() const override { return emptyAtom(); }
- int trackIndex() const override { return m_index; }
-
void setTrackIndex(int index) { m_index = index; }
MediaStreamTrackPrivate& streamTrack() { return m_streamTrack.get(); }
@@ -53,20 +50,57 @@
MediaTime timelineOffset() const { return m_timelineOffset; }
void setTimelineOffset(const MediaTime& offset) { m_timelineOffset = offset; }
+ void clear();
+
+ void play();
+ void pause();
+ bool isPlaying() { return m_isPlaying; }
+
+ void setVolume(float);
+ float volume() const;
+
+ void setMuted(bool muted) { m_muted = muted; }
+ bool muted() const { return m_muted; }
+
+#if !RELEASE_LOG_DISABLED
+ void setLogger(const Logger&, const void*) final;
+ const char* logClassName() const final { return "AudioTrackPrivateMediaStream"; }
+#endif
+
protected:
- AudioTrackPrivateMediaStream(MediaStreamTrackPrivate& track)
- : m_streamTrack(track)
- , m_id(track.id())
- , m_label(track.label())
- , m_timelineOffset(MediaTime::invalidTime())
- {
- }
+ explicit AudioTrackPrivateMediaStream(MediaStreamTrackPrivate&);
+ // AudioTrackPrivate
+ Kind kind() const final { return Kind::Main; }
+ AtomString id() const final { return m_id; }
+ AtomString label() const final { return m_label; }
+ int trackIndex() const final { return m_index; }
+
+ // MediaStreamTrackPrivate::Observer
+ void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
+ void trackEnded(MediaStreamTrackPrivate&) final;
+ void trackMutedChanged(MediaStreamTrackPrivate&) final;
+ void trackEnabledChanged(MediaStreamTrackPrivate&) final;
+ void trackSettingsChanged(MediaStreamTrackPrivate&) final { }
+
+ void playInternal();
+ void updateRendererMutedState();
+
+ // Main thread writable members
+ bool m_isPlaying { false };
+ bool m_autoPlay { false };
+ bool m_muted { false };
+ bool m_isCleared { false };
+
Ref<MediaStreamTrackPrivate> m_streamTrack;
AtomString m_id;
AtomString m_label;
int m_index { 0 };
MediaTime m_timelineOffset;
+
+ // Audio thread members
+ std::unique_ptr<AudioMediaStreamTrackRenderer> m_renderer;
+ bool m_hasStartedAutoplay { false };
};
}
Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h (254445 => 254446)
--- trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h 2020-01-13 19:57:39 UTC (rev 254445)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h 2020-01-13 20:21:23 UTC (rev 254446)
@@ -47,7 +47,7 @@
, public CanMakeWeakPtr<MediaStreamTrackPrivate, WeakPtrFactoryInitialization::Eager>
, public RealtimeMediaSource::Observer
#if !RELEASE_LOG_DISABLED
- , private LoggerHelper
+ , public LoggerHelper
#endif
{
public:
Copied: trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.cpp (from rev 254441, trunk/Source/WebCore/platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp) (0 => 254446)
--- trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.cpp (rev 0)
+++ trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.cpp 2020-01-13 20:21:23 UTC (rev 254446)
@@ -0,0 +1,221 @@
+/*
+ * Copyright (C) 2017-2020 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "AudioMediaStreamTrackRendererCocoa.h"
+
+#if ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
+
+#include "AudioSampleBufferList.h"
+#include "AudioSampleDataSource.h"
+#include "AudioSession.h"
+#include "CAAudioStreamDescription.h"
+#include "Logging.h"
+
+#include <pal/cf/CoreMediaSoftLink.h>
+#include <pal/spi/cocoa/AudioToolboxSPI.h>
+
+namespace WebCore {
+
+AudioMediaStreamTrackRendererCocoa::AudioMediaStreamTrackRendererCocoa() = default;
+
+AudioMediaStreamTrackRendererCocoa::~AudioMediaStreamTrackRendererCocoa() = default;
+
+void AudioMediaStreamTrackRendererCocoa::stop()
+{
+ if (!m_isAudioUnitStarted)
+ return;
+
+ if (m_remoteIOUnit)
+ AudioOutputUnitStop(m_remoteIOUnit);
+}
+
+void AudioMediaStreamTrackRendererCocoa::clear()
+{
+ if (m_dataSource)
+ m_dataSource->setPaused(true);
+
+ if (m_remoteIOUnit) {
+ AudioOutputUnitStop(m_remoteIOUnit);
+ AudioComponentInstanceDispose(m_remoteIOUnit);
+ m_remoteIOUnit = nullptr;
+ }
+
+ m_dataSource = nullptr;
+ m_inputDescription = nullptr;
+ m_outputDescription = nullptr;
+}
+
+void AudioMediaStreamTrackRendererCocoa::setPaused(bool value)
+{
+ m_paused = value;
+ if (m_dataSource)
+ m_dataSource->setPaused(value);
+}
+
+AudioComponentInstance AudioMediaStreamTrackRendererCocoa::createAudioUnit(CAAudioStreamDescription& outputDescription)
+{
+ AudioComponentInstance remoteIOUnit { nullptr };
+
+ AudioComponentDescription ioUnitDescription { kAudioUnitType_Output, 0, kAudioUnitManufacturer_Apple, 0, 0 };
+#if PLATFORM(IOS_FAMILY)
+ ioUnitDescription.componentSubType = kAudioUnitSubType_RemoteIO;
+#else
+ ioUnitDescription.componentSubType = kAudioUnitSubType_DefaultOutput;
+#endif
+
+ AudioComponent ioComponent = AudioComponentFindNext(nullptr, &ioUnitDescription);
+ ASSERT(ioComponent);
+ if (!ioComponent) {
+ ERROR_LOG(LOGIDENTIFIER, "unable to find remote IO unit component");
+ return nullptr;
+ }
+
+ OSStatus err = AudioComponentInstanceNew(ioComponent, &remoteIOUnit);
+ if (err) {
+ ERROR_LOG(LOGIDENTIFIER, "unable to open vpio unit, error = ", err, " (", (const char*)&err, ")");
+ return nullptr;
+ }
+
+#if PLATFORM(IOS_FAMILY)
+ UInt32 param = 1;
+ err = AudioUnitSetProperty(remoteIOUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, ¶m, sizeof(param));
+ if (err) {
+ ERROR_LOG(LOGIDENTIFIER, "unable to enable vpio unit output, error = ", err, " (", (const char*)&err, ")");
+ return nullptr;
+ }
+#endif
+
+ AURenderCallbackStruct callback = { inputProc, this };
+ err = AudioUnitSetProperty(remoteIOUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &callback, sizeof(callback));
+ if (err) {
+ ERROR_LOG(LOGIDENTIFIER, "unable to set vpio unit speaker proc, error = ", err, " (", (const char*)&err, ")");
+ return nullptr;
+ }
+
+ UInt32 size = sizeof(outputDescription.streamDescription());
+ err = AudioUnitGetProperty(remoteIOUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outputDescription.streamDescription(), &size);
+ if (err) {
+ ERROR_LOG(LOGIDENTIFIER, "unable to get input stream format, error = ", err, " (", (const char*)&err, ")");
+ return nullptr;
+ }
+
+ outputDescription.streamDescription().mSampleRate = AudioSession::sharedSession().sampleRate();
+
+ err = AudioUnitSetProperty(remoteIOUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outputDescription.streamDescription(), sizeof(outputDescription.streamDescription()));
+ if (err) {
+ ERROR_LOG(LOGIDENTIFIER, "unable to set input stream format, error = ", err, " (", (const char*)&err, ")");
+ return nullptr;
+ }
+
+ err = AudioUnitInitialize(remoteIOUnit);
+ if (err) {
+ ERROR_LOG(LOGIDENTIFIER, "AudioUnitInitialize() failed, error = ", err, " (", (const char*)&err, ")");
+ return nullptr;
+ }
+
+ return remoteIOUnit;
+}
+
+// May get called on a background thread.
+void AudioMediaStreamTrackRendererCocoa::pushSamples(const MediaTime& sampleTime, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t sampleCount)
+{
+ ASSERT(description.platformDescription().type == PlatformDescription::CAAudioStreamBasicType);
+
+ if (!m_inputDescription || *m_inputDescription != description) {
+ m_isAudioUnitStarted = false;
+
+ if (m_remoteIOUnit) {
+ AudioOutputUnitStop(m_remoteIOUnit);
+ AudioComponentInstanceDispose(m_remoteIOUnit);
+ m_remoteIOUnit = nullptr;
+ }
+
+ m_inputDescription = nullptr;
+ m_outputDescription = nullptr;
+
+ CAAudioStreamDescription inputDescription = toCAAudioStreamDescription(description);
+ CAAudioStreamDescription outputDescription;
+
+ auto remoteIOUnit = createAudioUnit(outputDescription);
+ if (!remoteIOUnit)
+ return;
+
+ m_inputDescription = makeUnique<CAAudioStreamDescription>(inputDescription);
+ m_outputDescription = makeUnique<CAAudioStreamDescription>(outputDescription);
+
+ m_dataSource = AudioSampleDataSource::create(description.sampleRate() * 2, *this);
+
+ if (m_dataSource->setInputFormat(inputDescription) || m_dataSource->setOutputFormat(outputDescription)) {
+ AudioComponentInstanceDispose(remoteIOUnit);
+ return;
+ }
+
+ if (auto error = AudioOutputUnitStart(remoteIOUnit)) {
+ ERROR_LOG(LOGIDENTIFIER, "AudioOutputUnitStart failed, error = ", error, " (", (const char*)&error, ")");
+ AudioComponentInstanceDispose(remoteIOUnit);
+ m_inputDescription = nullptr;
+ return;
+ }
+
+ m_isAudioUnitStarted = true;
+
+ m_dataSource->setVolume(volume());
+ m_remoteIOUnit = remoteIOUnit;
+ }
+
+ m_dataSource->pushSamples(sampleTime, audioData, sampleCount);
+
+ if (!m_isAudioUnitStarted) {
+ if (auto error = AudioOutputUnitStart(m_remoteIOUnit)) {
+ ERROR_LOG(LOGIDENTIFIER, "AudioOutputUnitStart failed, error = ", error, " (", (const char*)&error, ")");
+ return;
+ }
+ m_isAudioUnitStarted = true;
+ }
+}
+
+OSStatus AudioMediaStreamTrackRendererCocoa::render(UInt32 sampleCount, AudioBufferList& ioData, UInt32 /*inBusNumber*/, const AudioTimeStamp& timeStamp, AudioUnitRenderActionFlags& actionFlags)
+{
+ if (isMuted() || m_paused || !m_dataSource) {
+ AudioSampleBufferList::zeroABL(ioData, static_cast<size_t>(sampleCount * m_outputDescription->bytesPerFrame()));
+ actionFlags = kAudioUnitRenderAction_OutputIsSilence;
+ return 0;
+ }
+
+ m_dataSource->pullSamples(ioData, static_cast<size_t>(sampleCount), timeStamp.mSampleTime, timeStamp.mHostTime, AudioSampleDataSource::Copy);
+
+ return 0;
+}
+
+OSStatus AudioMediaStreamTrackRendererCocoa::inputProc(void* userData, AudioUnitRenderActionFlags* actionFlags, const AudioTimeStamp* timeStamp, UInt32 inBusNumber, UInt32 sampleCount, AudioBufferList* ioData)
+{
+ return static_cast<AudioMediaStreamTrackRendererCocoa*>(userData)->render(sampleCount, *ioData, inBusNumber, *timeStamp, *actionFlags);
+}
+
+
+} // namespace WebCore
+
+#endif // ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
Copied: trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.h (from rev 254441, trunk/Source/WebCore/platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.h) (0 => 254446)
--- trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.h (rev 0)
+++ trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.h 2020-01-13 20:21:23 UTC (rev 254446)
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
+
+#include "AudioMediaStreamTrackRenderer.h"
+#include "Logging.h"
+
+#include <AudioToolbox/AudioToolbox.h>
+#include <CoreAudio/CoreAudioTypes.h>
+
+namespace WebCore {
+
+class AudioSampleDataSource;
+class AudioSampleBufferList;
+class CAAudioStreamDescription;
+
+class AudioMediaStreamTrackRendererCocoa : public AudioMediaStreamTrackRenderer {
+ WTF_MAKE_FAST_ALLOCATED;
+public:
+ AudioMediaStreamTrackRendererCocoa();
+ ~AudioMediaStreamTrackRendererCocoa();
+
+private:
+ // AudioMediaStreamTrackRenderer
+ void pushSamples(const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
+ void stop() final;
+ void clear() final;
+ void setPaused(bool) final;
+
+ static OSStatus inputProc(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32 inBusNumber, UInt32 numberOfFrames, AudioBufferList*);
+ OSStatus render(UInt32 sampleCount, AudioBufferList&, UInt32 inBusNumber, const AudioTimeStamp&, AudioUnitRenderActionFlags&);
+
+ AudioComponentInstance createAudioUnit(CAAudioStreamDescription&);
+
+ // Audio thread members
+ AudioComponentInstance m_remoteIOUnit { nullptr };
+ std::unique_ptr<CAAudioStreamDescription> m_inputDescription;
+ std::unique_ptr<CAAudioStreamDescription> m_outputDescription;
+
+ // Cross thread members
+ RefPtr<AudioSampleDataSource> m_dataSource;
+ bool m_isAudioUnitStarted { false };
+ bool m_paused { false };
+};
+
+}
+
+#endif // ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
Deleted: trunk/Source/WebCore/platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp (254445 => 254446)
--- trunk/Source/WebCore/platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp 2020-01-13 19:57:39 UTC (rev 254445)
+++ trunk/Source/WebCore/platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp 2020-01-13 20:21:23 UTC (rev 254446)
@@ -1,284 +0,0 @@
-/*
- * Copyright (C) 2017 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "AudioTrackPrivateMediaStreamCocoa.h"
-
-#include "AudioSampleBufferList.h"
-#include "AudioSampleDataSource.h"
-#include "AudioSession.h"
-#include "CAAudioStreamDescription.h"
-#include "Logging.h"
-
-#include <pal/cf/CoreMediaSoftLink.h>
-#include <pal/spi/cocoa/AudioToolboxSPI.h>
-
-#if ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
-
-namespace WebCore {
-
-AudioTrackPrivateMediaStreamCocoa::AudioTrackPrivateMediaStreamCocoa(MediaStreamTrackPrivate& track)
- : AudioTrackPrivateMediaStream(track)
-{
- track.source().addObserver(*this);
-}
-
-AudioTrackPrivateMediaStreamCocoa::~AudioTrackPrivateMediaStreamCocoa()
-{
- clear();
-}
-
-void AudioTrackPrivateMediaStreamCocoa::clear()
-{
- if (m_isCleared)
- return;
-
- m_isCleared = true;
- streamTrack().source().removeObserver(*this);
-
- if (m_dataSource)
- m_dataSource->setPaused(true);
-
- if (m_remoteIOUnit) {
- AudioOutputUnitStop(m_remoteIOUnit);
- AudioComponentInstanceDispose(m_remoteIOUnit);
- m_remoteIOUnit = nullptr;
- }
-
- m_dataSource = nullptr;
- m_inputDescription = nullptr;
- m_outputDescription = nullptr;
-}
-
-void AudioTrackPrivateMediaStreamCocoa::playInternal()
-{
- ASSERT(isMainThread());
-
- if (m_isPlaying)
- return;
-
- m_isPlaying = true;
- m_autoPlay = false;
-
- if (m_dataSource)
- m_dataSource->setPaused(false);
-}
-
-void AudioTrackPrivateMediaStreamCocoa::play()
-{
- playInternal();
-}
-
-void AudioTrackPrivateMediaStreamCocoa::pause()
-{
- ASSERT(isMainThread());
-
- if (!m_isPlaying)
- return;
-
- m_isPlaying = false;
- m_autoPlay = false;
-
- if (m_dataSource)
- m_dataSource->setPaused(true);
-}
-
-void AudioTrackPrivateMediaStreamCocoa::setVolume(float volume)
-{
- m_volume = volume;
- if (m_dataSource)
- m_dataSource->setVolume(m_volume);
-}
-
-AudioComponentInstance AudioTrackPrivateMediaStreamCocoa::createAudioUnit(CAAudioStreamDescription& outputDescription)
-{
- AudioComponentInstance remoteIOUnit { nullptr };
-
- AudioComponentDescription ioUnitDescription { kAudioUnitType_Output, 0, kAudioUnitManufacturer_Apple, 0, 0 };
-#if PLATFORM(IOS_FAMILY)
- ioUnitDescription.componentSubType = kAudioUnitSubType_RemoteIO;
-#else
- ioUnitDescription.componentSubType = kAudioUnitSubType_DefaultOutput;
-#endif
-
- AudioComponent ioComponent = AudioComponentFindNext(nullptr, &ioUnitDescription);
- ASSERT(ioComponent);
- if (!ioComponent) {
- ERROR_LOG(LOGIDENTIFIER, "unable to find remote IO unit component");
- return nullptr;
- }
-
- OSStatus err = AudioComponentInstanceNew(ioComponent, &remoteIOUnit);
- if (err) {
- ERROR_LOG(LOGIDENTIFIER, "unable to open vpio unit, error = ", err, " (", (const char*)&err, ")");
- return nullptr;
- }
-
-#if PLATFORM(IOS_FAMILY)
- UInt32 param = 1;
- err = AudioUnitSetProperty(remoteIOUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, ¶m, sizeof(param));
- if (err) {
- ERROR_LOG(LOGIDENTIFIER, "unable to enable vpio unit output, error = ", err, " (", (const char*)&err, ")");
- return nullptr;
- }
-#endif
-
- AURenderCallbackStruct callback = { inputProc, this };
- err = AudioUnitSetProperty(remoteIOUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &callback, sizeof(callback));
- if (err) {
- ERROR_LOG(LOGIDENTIFIER, "unable to set vpio unit speaker proc, error = ", err, " (", (const char*)&err, ")");
- return nullptr;
- }
-
- UInt32 size = sizeof(outputDescription.streamDescription());
- err = AudioUnitGetProperty(remoteIOUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outputDescription.streamDescription(), &size);
- if (err) {
- ERROR_LOG(LOGIDENTIFIER, "unable to get input stream format, error = ", err, " (", (const char*)&err, ")");
- return nullptr;
- }
-
- outputDescription.streamDescription().mSampleRate = AudioSession::sharedSession().sampleRate();
-
- err = AudioUnitSetProperty(remoteIOUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outputDescription.streamDescription(), sizeof(outputDescription.streamDescription()));
- if (err) {
- ERROR_LOG(LOGIDENTIFIER, "unable to set input stream format, error = ", err, " (", (const char*)&err, ")");
- return nullptr;
- }
-
- err = AudioUnitInitialize(remoteIOUnit);
- if (err) {
- ERROR_LOG(LOGIDENTIFIER, "AudioUnitInitialize() failed, error = ", err, " (", (const char*)&err, ")");
- return nullptr;
- }
-
- return remoteIOUnit;
-}
-
-// May get called on a background thread.
-void AudioTrackPrivateMediaStreamCocoa::audioSamplesAvailable(const MediaTime& sampleTime, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t sampleCount)
-{
- ASSERT(description.platformDescription().type == PlatformDescription::CAAudioStreamBasicType);
-
- if (!m_isPlaying) {
- if (m_isAudioUnitStarted) {
- if (m_remoteIOUnit)
- AudioOutputUnitStop(m_remoteIOUnit);
- m_isAudioUnitStarted = false;
- }
- return;
- }
-
- if (!m_inputDescription || *m_inputDescription != description) {
- m_isAudioUnitStarted = false;
-
- if (m_remoteIOUnit) {
- AudioOutputUnitStop(m_remoteIOUnit);
- AudioComponentInstanceDispose(m_remoteIOUnit);
- m_remoteIOUnit = nullptr;
- }
-
- m_inputDescription = nullptr;
- m_outputDescription = nullptr;
-
- CAAudioStreamDescription inputDescription = toCAAudioStreamDescription(description);
- CAAudioStreamDescription outputDescription;
-
- auto remoteIOUnit = createAudioUnit(outputDescription);
- if (!remoteIOUnit)
- return;
-
- m_inputDescription = makeUnique<CAAudioStreamDescription>(inputDescription);
- m_outputDescription = makeUnique<CAAudioStreamDescription>(outputDescription);
-
- m_dataSource = AudioSampleDataSource::create(description.sampleRate() * 2, streamTrack());
-
- if (m_dataSource->setInputFormat(inputDescription) || m_dataSource->setOutputFormat(outputDescription)) {
- AudioComponentInstanceDispose(remoteIOUnit);
- return;
- }
-
- if (auto error = AudioOutputUnitStart(remoteIOUnit)) {
- ERROR_LOG(LOGIDENTIFIER, "AudioOutputUnitStart failed, error = ", error, " (", (const char*)&error, ")");
- AudioComponentInstanceDispose(remoteIOUnit);
- m_inputDescription = nullptr;
- return;
- }
-
- m_isAudioUnitStarted = true;
-
- m_dataSource->setVolume(m_volume);
- m_remoteIOUnit = remoteIOUnit;
- }
-
- m_dataSource->pushSamples(sampleTime, audioData, sampleCount);
-
- if (m_autoPlay && !m_hasStartedAutoplay) {
- m_hasStartedAutoplay = true;
- callOnMainThread([this, protectedThis = makeRef(*this)] {
- if (m_autoPlay)
- playInternal();
- });
- }
-
- if (!m_isAudioUnitStarted) {
- if (auto error = AudioOutputUnitStart(m_remoteIOUnit)) {
- ERROR_LOG(LOGIDENTIFIER, "AudioOutputUnitStart failed, error = ", error, " (", (const char*)&error, ")");
- return;
- }
- m_isAudioUnitStarted = true;
- }
-}
-
-void AudioTrackPrivateMediaStreamCocoa::sourceStopped()
-{
- pause();
-}
-
-OSStatus AudioTrackPrivateMediaStreamCocoa::render(UInt32 sampleCount, AudioBufferList& ioData, UInt32 /*inBusNumber*/, const AudioTimeStamp& timeStamp, AudioUnitRenderActionFlags& actionFlags)
-{
- // This function is called on a high-priority background thread. The following protectedThis object ensures the object is not
- // destroyed on the main thread before this function exits.
- Ref<AudioTrackPrivateMediaStreamCocoa> protectedThis { *this };
-
- if (!m_isPlaying || m_muted || !m_dataSource || streamTrack().muted() || streamTrack().ended() || !streamTrack().enabled()) {
- AudioSampleBufferList::zeroABL(ioData, static_cast<size_t>(sampleCount * m_outputDescription->bytesPerFrame()));
- actionFlags = kAudioUnitRenderAction_OutputIsSilence;
- return 0;
- }
-
- m_dataSource->pullSamples(ioData, static_cast<size_t>(sampleCount), timeStamp.mSampleTime, timeStamp.mHostTime, AudioSampleDataSource::Copy);
-
- return 0;
-}
-
-OSStatus AudioTrackPrivateMediaStreamCocoa::inputProc(void* userData, AudioUnitRenderActionFlags* actionFlags, const AudioTimeStamp* timeStamp, UInt32 inBusNumber, UInt32 sampleCount, AudioBufferList* ioData)
-{
- return static_cast<AudioTrackPrivateMediaStreamCocoa*>(userData)->render(sampleCount, *ioData, inBusNumber, *timeStamp, *actionFlags);
-}
-
-
-} // namespace WebCore
-
-#endif // ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
Deleted: trunk/Source/WebCore/platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.h (254445 => 254446)
--- trunk/Source/WebCore/platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.h 2020-01-13 19:57:39 UTC (rev 254445)
+++ trunk/Source/WebCore/platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.h 2020-01-13 20:21:23 UTC (rev 254446)
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2017 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#if ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
-
-#include "AudioTrackPrivateMediaStream.h"
-#include <AudioToolbox/AudioToolbox.h>
-#include <CoreAudio/CoreAudioTypes.h>
-
-namespace WebCore {
-
-class AudioSampleDataSource;
-class AudioSampleBufferList;
-class CAAudioStreamDescription;
-
-class AudioTrackPrivateMediaStreamCocoa final : public AudioTrackPrivateMediaStream, private RealtimeMediaSource::Observer {
- WTF_MAKE_NONCOPYABLE(AudioTrackPrivateMediaStreamCocoa)
-public:
- static RefPtr<AudioTrackPrivateMediaStreamCocoa> create(MediaStreamTrackPrivate& streamTrack)
- {
- return adoptRef(*new AudioTrackPrivateMediaStreamCocoa(streamTrack));
- }
-
- void clear();
-
- void play();
- void pause();
- bool isPlaying() { return m_isPlaying; }
-
- void setVolume(float);
- float volume() const { return m_volume; }
-
- void setMuted(bool muted) { m_muted = muted; }
- bool muted() const { return m_muted; }
-
-private:
- AudioTrackPrivateMediaStreamCocoa(MediaStreamTrackPrivate&);
- ~AudioTrackPrivateMediaStreamCocoa();
-
- // RealtimeMediaSource::Observer
- void sourceStopped() final;
- void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
-
- static OSStatus inputProc(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32 inBusNumber, UInt32 numberOfFrames, AudioBufferList*);
- OSStatus render(UInt32 sampleCount, AudioBufferList&, UInt32 inBusNumber, const AudioTimeStamp&, AudioUnitRenderActionFlags&);
-
- AudioComponentInstance createAudioUnit(CAAudioStreamDescription&);
- void cleanup();
- void zeroBufferList(AudioBufferList&, size_t);
- void playInternal();
-
-#if !RELEASE_LOG_DISABLED
- const char* logClassName() const final { return "AudioTrackPrivateMediaStreamCocoa"; }
-#endif
-
- // Audio thread members
- AudioComponentInstance m_remoteIOUnit { nullptr };
- std::unique_ptr<CAAudioStreamDescription> m_inputDescription;
- std::unique_ptr<CAAudioStreamDescription> m_outputDescription;
- bool m_isAudioUnitStarted { false };
- bool m_hasStartedAutoplay { false };
-
- // Cross thread members
- RefPtr<AudioSampleDataSource> m_dataSource;
-
- // Main thread writable members
- float m_volume { 1 };
- bool m_isPlaying { false };
- bool m_autoPlay { false };
- bool m_muted { false };
- bool m_isCleared { false };
-};
-
-}
-
-#endif // ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)