Changeset 247522 in webkit


Ignore:
Timestamp:
Jul 17, 2019 11:11:36 AM (5 years ago)
Author:
youenn@apple.com
Message:

Add release logging to AudioSampleDataSource
https://bugs.webkit.org/show_bug.cgi?id=199814
<rdar://problem/53128140>

Reviewed by Eric Carlson.

Use release logging for AudioSampleDataSource in case of errors.
This requires passing a logger and a logger identifier.
For that purpose, pass a MediaStreamTrackPrivate to it constructor
and reuse its logger and log identifier.

For each log, hop to the main thread as release logging requires to be done in the main thread.
Add specific handling for RealtimeOutgoingAudioSource as its MediaStreamTrack can change in case of replaceTrack.
In that case, we change of logger when changing the MediaStreamTrackPrivate.

No observable change of behavior, covered by existing tests.

  • platform/audio/mac/AudioSampleDataSource.h:
  • platform/audio/mac/AudioSampleDataSource.mm:

(WebCore::AudioSampleDataSource::create):
(WebCore::AudioSampleDataSource::AudioSampleDataSource):
(WebCore::AudioSampleDataSource::setupConverter):
(WebCore::AudioSampleDataSource::pushSamplesInternal):
(WebCore::AudioSampleDataSource::pullSamplesInternal):
(WebCore::AudioSampleDataSource::setLogger):
(WebCore::AudioSampleDataSource::logChannel const):

  • platform/mediastream/RealtimeOutgoingAudioSource.cpp:

(WebCore::RealtimeOutgoingAudioSource::setSource):

  • platform/mediastream/RealtimeOutgoingAudioSource.h:

(WebCore::RealtimeOutgoingAudioSource::sourceUpdated):

  • platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp:

(WebCore::AudioTrackPrivateMediaStreamCocoa::audioSamplesAvailable):

  • platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.h:

Instead of using its own logger/identifier member field, reuse its MediaStreamTrackPrivate.

  • platform/mediastream/mac/RealtimeOutgoingAudioSourceCocoa.cpp:

(WebCore::RealtimeOutgoingAudioSourceCocoa::RealtimeOutgoingAudioSourceCocoa):
(WebCore::RealtimeOutgoingAudioSourceCocoa::sourceUpdated):

  • platform/mediastream/mac/RealtimeOutgoingAudioSourceCocoa.h:
  • platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm:

(WebCore::WebAudioSourceProviderAVFObjC::prepare):

Location:
trunk/Source/WebCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r247521 r247522  
     12019-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
    1442019-07-17  Kenneth Russell  <kbr@chromium.org>
    245
  • trunk/Source/WebCore/platform/audio/mac/AudioSampleDataSource.h

    r213931 r247522  
    3030#include "AudioSampleBufferList.h"
    3131#include <CoreAudio/CoreAudioTypes.h>
     32#include <wtf/LoggerHelper.h>
    3233#include <wtf/MediaTime.h>
    33 #include <wtf/RefCounted.h>
    3434#include <wtf/RefPtr.h>
     35#include <wtf/ThreadSafeRefCounted.h>
    3536#include <wtf/text/WTFString.h>
    3637
     
    4243class CAAudioStreamDescription;
    4344class CARingBuffer;
     45class MediaStreamTrackPrivate;
    4446
    45 class AudioSampleDataSource : public RefCounted<AudioSampleDataSource> {
     47class AudioSampleDataSource : public ThreadSafeRefCounted<AudioSampleDataSource, WTF::DestructionThread::MainRunLoop>
     48#if !RELEASE_LOG_DISABLED
     49    , private LoggerHelper
     50#endif
     51    {
    4652public:
    47     static Ref<AudioSampleDataSource> create(size_t);
     53    static Ref<AudioSampleDataSource> create(size_t, MediaStreamTrackPrivate&);
    4854
    4955    ~AudioSampleDataSource();
     
    6975    bool muted() const { return m_muted; }
    7076
    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
     83private:
     84    AudioSampleDataSource(size_t, MediaStreamTrackPrivate&);
    7385
    7486    OSStatus setupConverter();
     
    8294    MediaTime hostTime() const;
    8395
     96#if !RELEASE_LOG_DISABLED
     97    const char* logClassName() const final { return "AudioSampleDataSource"; }
     98    WTFLogChannel& logChannel() const final;
     99#endif
     100
    84101    uint64_t m_lastPushedSampleCount { 0 };
    85102    MediaTime m_expectedNextPushedSampleTime { MediaTime::invalidTime() };
    86     double m_hostTime { -1 };
    87103
    88104    MediaTime m_inputSampleOffset;
     
    99115    bool m_paused { true };
    100116    bool m_transitioningFromPaused { true };
     117
     118#if !RELEASE_LOG_DISABLED
     119    Ref<const Logger> m_logger;
     120    const void* m_logIdentifier;
     121#endif
    101122};
    102123
  • trunk/Source/WebCore/platform/audio/mac/AudioSampleDataSource.mm

    r229209 r247522  
    3232#include "CARingBuffer.h"
    3333#include "Logging.h"
     34#include "MediaStreamTrackPrivate.h"
    3435#include <AudioToolbox/AudioConverter.h>
    3536#include <mach/mach.h>
     
    4647using namespace JSC;
    4748
    48 Ref<AudioSampleDataSource> AudioSampleDataSource::create(size_t maximumSampleCount)
    49 {
    50     return adoptRef(*new AudioSampleDataSource(maximumSampleCount));
    51 }
    52 
    53 AudioSampleDataSource::AudioSampleDataSource(size_t maximumSampleCount)
     49Ref<AudioSampleDataSource> AudioSampleDataSource::create(size_t maximumSampleCount, MediaStreamTrackPrivate& track)
     50{
     51    return adoptRef(*new AudioSampleDataSource(maximumSampleCount, track));
     52}
     53
     54AudioSampleDataSource::AudioSampleDataSource(size_t maximumSampleCount, MediaStreamTrackPrivate& track)
    5455    : m_inputSampleOffset(MediaTime::invalidTime())
    5556    , m_maximumSampleCount(maximumSampleCount)
     57#if !RELEASE_LOG_DISABLED
     58    , m_logger(track.logger())
     59    , m_logIdentifier(track.logIdentifier())
     60#endif
    5661{
    5762}
     
    9095
    9196    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    }
    94102
    95103    return err;
     
    162170    if (m_inputSampleOffset == MediaTime::invalidTime()) {
    163171        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        });
    165175    }
    166176    sampleTime += m_inputSampleOffset;
     
    249259#if !LOG_DISABLED
    250260    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);
    252262    });
    253263#endif
     
    262272            framesAvailable = timeStamp + sampleCount - endFrame;
    263273
    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");
    267279        });
    268280#endif
     
    352364}
    353365
     366#if !RELEASE_LOG_DISABLED
     367void AudioSampleDataSource::setLogger(Ref<const Logger>&& logger, const void* logIdentifier)
     368{
     369    m_logger = WTFMove(logger);
     370    m_logIdentifier = logIdentifier;
     371}
     372
     373WTFLogChannel& AudioSampleDataSource::logChannel() const
     374{
     375    return LogWebRTC;
     376}
     377#endif
     378
    354379} // namespace WebCore
    355380
  • trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingAudioSource.cpp

    r243033 r247522  
    4141RealtimeOutgoingAudioSource::RealtimeOutgoingAudioSource(Ref<MediaStreamTrackPrivate>&& source)
    4242    : m_audioSource(WTFMove(source))
    43 #if !RELEASE_LOG_DISABLED
    44     , m_logger(m_audioSource->logger())
    45     , m_logIdentifier(m_audioSource->logIdentifier())
    46 #endif
    4743{
    4844}
     
    6763bool RealtimeOutgoingAudioSource::setSource(Ref<MediaStreamTrackPrivate>&& newSource)
    6864{
     65    ALWAYS_LOG("Changing source to ", newSource->logIdentifier());
    6966    auto locker = holdLock(m_sinksLock);
    7067    bool hasSinks = !m_sinks.isEmpty();
     
    7572    if (hasSinks)
    7673        observeSource();
     74
     75    sourceUpdated();
    7776
    7877    return true;
  • trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingAudioSource.h

    r243033 r247522  
    8383#if !RELEASE_LOG_DISABLED
    8484    // 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(); }
    8787    const char* logClassName() const final { return "RealtimeOutgoingAudioSource"; }
    8888    WTFLogChannel& logChannel() const final;
     
    116116    virtual bool isReachingBufferedAudioDataLowLimit() { return false; };
    117117    virtual bool hasBufferedEnoughData() { return false; };
     118    virtual void sourceUpdated() { }
    118119
    119120    // MediaStreamTrackPrivate::Observer API
     
    134135
    135136#if !RELEASE_LOG_DISABLED
    136     mutable Ref<const Logger> m_logger;
    137     const void* m_logIdentifier;
    138137    size_t m_chunksSent { 0 };
    139138#endif
  • trunk/Source/WebCore/platform/mediastream/mac/AudioTrackPrivateMediaStreamCocoa.cpp

    r239702 r247522  
    192192        m_outputDescription = std::make_unique<CAAudioStreamDescription>(outputDescription);
    193193
    194         m_dataSource = AudioSampleDataSource::create(description.sampleRate() * 2);
     194        m_dataSource = AudioSampleDataSource::create(description.sampleRate() * 2, streamTrack());
    195195
    196196        if (m_dataSource->setInputFormat(inputDescription) || m_dataSource->setOutputFormat(outputDescription)) {
  • trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingAudioSourceCocoa.cpp

    r240120 r247522  
    4747RealtimeOutgoingAudioSourceCocoa::RealtimeOutgoingAudioSourceCocoa(Ref<MediaStreamTrackPrivate>&& audioSource)
    4848    : RealtimeOutgoingAudioSource(WTFMove(audioSource))
    49     , m_sampleConverter(AudioSampleDataSource::create(LibWebRTCAudioFormat::sampleRate * 2))
     49    , m_sampleConverter(AudioSampleDataSource::create(LibWebRTCAudioFormat::sampleRate * 2, source()))
    5050{
    5151}
     
    146146}
    147147
     148void RealtimeOutgoingAudioSourceCocoa::sourceUpdated()
     149{
     150#if !RELEASE_LOG_DISABLED
     151    m_sampleConverter->setLogger(source().logger(), source().logIdentifier());
     152#endif
     153}
     154
    148155} // namespace WebCore
    149156
  • trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingAudioSourceCocoa.h

    r237867 r247522  
    5151    bool isReachingBufferedAudioDataLowLimit() final;
    5252    bool hasBufferedEnoughData() final;
     53    void sourceUpdated() final;
    5354
    5455    void pullAudioData() final;
  • trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm

    r239427 r247522  
    136136
    137137    if (!m_dataSource)
    138         m_dataSource = AudioSampleDataSource::create(kRingBufferDuration * sampleRate);
     138        m_dataSource = AudioSampleDataSource::create(kRingBufferDuration * sampleRate, *m_captureSource);
    139139    m_dataSource->setInputFormat(m_inputDescription.value());
    140140    m_dataSource->setOutputFormat(m_outputDescription.value());
Note: See TracChangeset for help on using the changeset viewer.