Changeset 247522 in webkit
- Timestamp:
- Jul 17, 2019 11:11:36 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r247521 r247522 1 2019-07-17 Youenn Fablet <youenn@apple.com> 2 3 Add release logging to AudioSampleDataSource 4 https://bugs.webkit.org/show_bug.cgi?id=199814 5 <rdar://problem/53128140> 6 7 Reviewed by Eric Carlson. 8 9 Use release logging for AudioSampleDataSource in case of errors. 10 This requires passing a logger and a logger identifier. 11 For that purpose, pass a MediaStreamTrackPrivate to it constructor 12 and reuse its logger and log identifier. 13 14 For each log, hop to the main thread as release logging requires to be done in the main thread. 15 Add specific handling for RealtimeOutgoingAudioSource as its MediaStreamTrack can change in case of replaceTrack. 16 In that case, we change of logger when changing the MediaStreamTrackPrivate. 17 18 No observable change of behavior, covered by existing tests. 19 20 * platform/audio/mac/AudioSampleDataSource.h: 21 * platform/audio/mac/AudioSampleDataSource.mm: 22 (WebCore::AudioSampleDataSource::create): 23 (WebCore::AudioSampleDataSource::AudioSampleDataSource): 24 (WebCore::AudioSampleDataSource::setupConverter): 25 (WebCore::AudioSampleDataSource::pushSamplesInternal): 26 (WebCore::AudioSampleDataSource::pullSamplesInternal): 27 (WebCore::AudioSampleDataSource::setLogger): 28 (WebCore::AudioSampleDataSource::logChannel const): 29 * platform/mediastream/RealtimeOutgoingAudioSource.cpp: 30 (WebCore::RealtimeOutgoingAudioSource::setSource): 31 * platform/mediastream/RealtimeOutgoingAudioSource.h: 32 (WebCore::RealtimeOutgoingAudioSource::sourceUpdated): 33 * platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp: 34 (WebCore::AudioTrackPrivateMediaStreamCocoa::audioSamplesAvailable): 35 * platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.h: 36 Instead of using its own logger/identifier member field, reuse its MediaStreamTrackPrivate. 37 * platform/mediastream/mac/RealtimeOutgoingAudioSourceCocoa.cpp: 38 (WebCore::RealtimeOutgoingAudioSourceCocoa::RealtimeOutgoingAudioSourceCocoa): 39 (WebCore::RealtimeOutgoingAudioSourceCocoa::sourceUpdated): 40 * platform/mediastream/mac/RealtimeOutgoingAudioSourceCocoa.h: 41 * platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm: 42 (WebCore::WebAudioSourceProviderAVFObjC::prepare): 43 1 44 2019-07-17 Kenneth Russell <kbr@chromium.org> 2 45 -
trunk/Source/WebCore/platform/audio/mac/AudioSampleDataSource.h
r213931 r247522 30 30 #include "AudioSampleBufferList.h" 31 31 #include <CoreAudio/CoreAudioTypes.h> 32 #include <wtf/LoggerHelper.h> 32 33 #include <wtf/MediaTime.h> 33 #include <wtf/RefCounted.h>34 34 #include <wtf/RefPtr.h> 35 #include <wtf/ThreadSafeRefCounted.h> 35 36 #include <wtf/text/WTFString.h> 36 37 … … 42 43 class CAAudioStreamDescription; 43 44 class CARingBuffer; 45 class MediaStreamTrackPrivate; 44 46 45 class AudioSampleDataSource : public RefCounted<AudioSampleDataSource> { 47 class AudioSampleDataSource : public ThreadSafeRefCounted<AudioSampleDataSource, WTF::DestructionThread::MainRunLoop> 48 #if !RELEASE_LOG_DISABLED 49 , private LoggerHelper 50 #endif 51 { 46 52 public: 47 static Ref<AudioSampleDataSource> create(size_t );53 static Ref<AudioSampleDataSource> create(size_t, MediaStreamTrackPrivate&); 48 54 49 55 ~AudioSampleDataSource(); … … 69 75 bool muted() const { return m_muted; } 70 76 71 protected: 72 AudioSampleDataSource(size_t); 77 #if !RELEASE_LOG_DISABLED 78 const Logger& logger() const final { return m_logger; } 79 const void* logIdentifier() const final { return m_logIdentifier; } 80 void setLogger(Ref<const Logger>&&, const void*); 81 #endif 82 83 private: 84 AudioSampleDataSource(size_t, MediaStreamTrackPrivate&); 73 85 74 86 OSStatus setupConverter(); … … 82 94 MediaTime hostTime() const; 83 95 96 #if !RELEASE_LOG_DISABLED 97 const char* logClassName() const final { return "AudioSampleDataSource"; } 98 WTFLogChannel& logChannel() const final; 99 #endif 100 84 101 uint64_t m_lastPushedSampleCount { 0 }; 85 102 MediaTime m_expectedNextPushedSampleTime { MediaTime::invalidTime() }; 86 double m_hostTime { -1 };87 103 88 104 MediaTime m_inputSampleOffset; … … 99 115 bool m_paused { true }; 100 116 bool m_transitioningFromPaused { true }; 117 118 #if !RELEASE_LOG_DISABLED 119 Ref<const Logger> m_logger; 120 const void* m_logIdentifier; 121 #endif 101 122 }; 102 123 -
trunk/Source/WebCore/platform/audio/mac/AudioSampleDataSource.mm
r229209 r247522 32 32 #include "CARingBuffer.h" 33 33 #include "Logging.h" 34 #include "MediaStreamTrackPrivate.h" 34 35 #include <AudioToolbox/AudioConverter.h> 35 36 #include <mach/mach.h> … … 46 47 using namespace JSC; 47 48 48 Ref<AudioSampleDataSource> AudioSampleDataSource::create(size_t maximumSampleCount )49 { 50 return adoptRef(*new AudioSampleDataSource(maximumSampleCount ));51 } 52 53 AudioSampleDataSource::AudioSampleDataSource(size_t maximumSampleCount )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) 54 55 : m_inputSampleOffset(MediaTime::invalidTime()) 55 56 , m_maximumSampleCount(maximumSampleCount) 57 #if !RELEASE_LOG_DISABLED 58 , m_logger(track.logger()) 59 , m_logIdentifier(track.logIdentifier()) 60 #endif 56 61 { 57 62 } … … 90 95 91 96 OSStatus err = AudioConverterNew(&m_inputDescription->streamDescription(), &m_outputDescription->streamDescription(), &m_converter); 92 if (err) 93 LOG_ERROR("AudioSampleDataSource::setupConverter(%p) - AudioConverterNew returned error %d (%.4s)", this, (int)err, (char*)&err); 97 if (err) { 98 dispatch_async(dispatch_get_main_queue(), [this, protectedThis = makeRefPtr(*this), err] { 99 ERROR_LOG("AudioConverterNew returned error ", err); 100 }); 101 } 94 102 95 103 return err; … … 162 170 if (m_inputSampleOffset == MediaTime::invalidTime()) { 163 171 m_inputSampleOffset = MediaTime(1 - sampleTime.timeValue(), sampleTime.timeScale()); 164 LOG(MediaCaptureSamples, "@@ pushSamples: input sample offset is %lld, m_maximumSampleCount = %zu", m_inputSampleOffset.timeValue(), m_maximumSampleCount); 172 dispatch_async(dispatch_get_main_queue(), [inputSampleOffset = m_inputSampleOffset.timeValue(), maximumSampleCount = m_maximumSampleCount, this, protectedThis = makeRefPtr(*this)] { 173 ERROR_LOG("pushSamples: input sample offset is ", inputSampleOffset, ", maximumSampleCount = ", maximumSampleCount); 174 }); 165 175 } 166 176 sampleTime += m_inputSampleOffset; … … 249 259 #if !LOG_DISABLED 250 260 dispatch_async(dispatch_get_main_queue(), [sampleCount, timeStamp, sampleOffset = m_outputSampleOffset] { 251 LOG(MediaCaptureSamples, "** pullSamples : asking for %ld samples at time = %lld (was %lld)", sampleCount, timeStamp, timeStamp - sampleOffset);261 LOG(MediaCaptureSamples, "** pullSamplesInternal: asking for %ld samples at time = %lld (was %lld)", sampleCount, timeStamp, timeStamp - sampleOffset); 252 262 }); 253 263 #endif … … 262 272 framesAvailable = timeStamp + sampleCount - endFrame; 263 273 264 #if !LOG_DISABLED 265 dispatch_async(dispatch_get_main_queue(), [timeStamp, startFrame, endFrame, framesAvailable] { 266 LOG(MediaCaptureSamples, "** pullSamplesInternal: sample %lld is not completely in range [%lld .. %lld], returning %lld frames", timeStamp, startFrame, endFrame, framesAvailable); 274 #if !RELEASE_LOG_DISABLED 275 dispatch_async(dispatch_get_main_queue(), [timeStamp, startFrame, endFrame, framesAvailable, sampleCount, this, protectedThis = makeRefPtr(*this)] { 276 ALWAYS_LOG("sample ", timeStamp, " is not completely in range [", startFrame, " .. ", endFrame, "], returning ", framesAvailable, " frames"); 277 if (framesAvailable < sampleCount) 278 ERROR_LOG("not enough data available, returning zeroes"); 267 279 }); 268 280 #endif … … 352 364 } 353 365 366 #if !RELEASE_LOG_DISABLED 367 void AudioSampleDataSource::setLogger(Ref<const Logger>&& logger, const void* logIdentifier) 368 { 369 m_logger = WTFMove(logger); 370 m_logIdentifier = logIdentifier; 371 } 372 373 WTFLogChannel& AudioSampleDataSource::logChannel() const 374 { 375 return LogWebRTC; 376 } 377 #endif 378 354 379 } // namespace WebCore 355 380 -
trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingAudioSource.cpp
r243033 r247522 41 41 RealtimeOutgoingAudioSource::RealtimeOutgoingAudioSource(Ref<MediaStreamTrackPrivate>&& source) 42 42 : m_audioSource(WTFMove(source)) 43 #if !RELEASE_LOG_DISABLED44 , m_logger(m_audioSource->logger())45 , m_logIdentifier(m_audioSource->logIdentifier())46 #endif47 43 { 48 44 } … … 67 63 bool RealtimeOutgoingAudioSource::setSource(Ref<MediaStreamTrackPrivate>&& newSource) 68 64 { 65 ALWAYS_LOG("Changing source to ", newSource->logIdentifier()); 69 66 auto locker = holdLock(m_sinksLock); 70 67 bool hasSinks = !m_sinks.isEmpty(); … … 75 72 if (hasSinks) 76 73 observeSource(); 74 75 sourceUpdated(); 77 76 78 77 return true; -
trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingAudioSource.h
r243033 r247522 83 83 #if !RELEASE_LOG_DISABLED 84 84 // LoggerHelper API 85 const Logger& logger() const final { return m_ logger.get(); }86 const void* logIdentifier() const final { return m_ logIdentifier; }85 const Logger& logger() const final { return m_audioSource->logger(); } 86 const void* logIdentifier() const final { return m_audioSource->logIdentifier(); } 87 87 const char* logClassName() const final { return "RealtimeOutgoingAudioSource"; } 88 88 WTFLogChannel& logChannel() const final; … … 116 116 virtual bool isReachingBufferedAudioDataLowLimit() { return false; }; 117 117 virtual bool hasBufferedEnoughData() { return false; }; 118 virtual void sourceUpdated() { } 118 119 119 120 // MediaStreamTrackPrivate::Observer API … … 134 135 135 136 #if !RELEASE_LOG_DISABLED 136 mutable Ref<const Logger> m_logger;137 const void* m_logIdentifier;138 137 size_t m_chunksSent { 0 }; 139 138 #endif -
trunk/Source/WebCore/platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp
r239702 r247522 192 192 m_outputDescription = std::make_unique<CAAudioStreamDescription>(outputDescription); 193 193 194 m_dataSource = AudioSampleDataSource::create(description.sampleRate() * 2 );194 m_dataSource = AudioSampleDataSource::create(description.sampleRate() * 2, streamTrack()); 195 195 196 196 if (m_dataSource->setInputFormat(inputDescription) || m_dataSource->setOutputFormat(outputDescription)) { -
trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingAudioSourceCocoa.cpp
r240120 r247522 47 47 RealtimeOutgoingAudioSourceCocoa::RealtimeOutgoingAudioSourceCocoa(Ref<MediaStreamTrackPrivate>&& audioSource) 48 48 : RealtimeOutgoingAudioSource(WTFMove(audioSource)) 49 , m_sampleConverter(AudioSampleDataSource::create(LibWebRTCAudioFormat::sampleRate * 2 ))49 , m_sampleConverter(AudioSampleDataSource::create(LibWebRTCAudioFormat::sampleRate * 2, source())) 50 50 { 51 51 } … … 146 146 } 147 147 148 void RealtimeOutgoingAudioSourceCocoa::sourceUpdated() 149 { 150 #if !RELEASE_LOG_DISABLED 151 m_sampleConverter->setLogger(source().logger(), source().logIdentifier()); 152 #endif 153 } 154 148 155 } // namespace WebCore 149 156 -
trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingAudioSourceCocoa.h
r237867 r247522 51 51 bool isReachingBufferedAudioDataLowLimit() final; 52 52 bool hasBufferedEnoughData() final; 53 void sourceUpdated() final; 53 54 54 55 void pullAudioData() final; -
trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm
r239427 r247522 136 136 137 137 if (!m_dataSource) 138 m_dataSource = AudioSampleDataSource::create(kRingBufferDuration * sampleRate );138 m_dataSource = AudioSampleDataSource::create(kRingBufferDuration * sampleRate, *m_captureSource); 139 139 m_dataSource->setInputFormat(m_inputDescription.value()); 140 140 m_dataSource->setOutputFormat(m_outputDescription.value());
Note: See TracChangeset
for help on using the changeset viewer.