Changeset 216455 in webkit


Ignore:
Timestamp:
May 8, 2017 3:12:39 PM (7 years ago)
Author:
commit-queue@webkit.org
Message:

CoreAudioSharedUnit should own its configuration parameters
https://bugs.webkit.org/show_bug.cgi?id=171812

Patch by Youenn Fablet <youenn@apple.com> on 2017-05-08
Reviewed by Eric Carlson.

Covered by manual tests.

Add sampleRate, volume and echoCancellation parameters to the shared audio unit.
Set default values when creating the shared audio unit and use those for the creation of new sources.
Add support for volume.
Add support for disabling echo cancellation.
Check valid sample rates when trying to apply a sample rate.

  • platform/mediastream/RealtimeMediaSource.h:
  • platform/mediastream/mac/CoreAudioCaptureSource.cpp:

(WebCore::CoreAudioSharedUnit::volume):
(WebCore::CoreAudioSharedUnit::sampleRate):
(WebCore::CoreAudioSharedUnit::enableEchoCancellation):
(WebCore::CoreAudioSharedUnit::setVolume):
(WebCore::CoreAudioSharedUnit::setSampleRate):
(WebCore::CoreAudioSharedUnit::setEnableEchoCancellation):
(WebCore::CoreAudioSharedUnit::CoreAudioSharedUnit):
(WebCore::CoreAudioSharedUnit::setupAudioUnits):
(WebCore::CoreAudioSharedUnit::configureMicrophoneProc):
(WebCore::CoreAudioSharedUnit::configureSpeakerProc):
(WebCore::CoreAudioSharedUnit::processMicrophoneSamples):
(WebCore::CoreAudioCaptureSource::CoreAudioCaptureSource):
(WebCore::CoreAudioCaptureSource::applySampleRate):
(WebCore::CoreAudioCaptureSource::applyEchoCancellation):

  • platform/mediastream/mac/CoreAudioCaptureSource.h:
Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r216452 r216455  
     12017-05-08  Youenn Fablet  <youenn@apple.com>
     2
     3        CoreAudioSharedUnit should own its configuration parameters
     4        https://bugs.webkit.org/show_bug.cgi?id=171812
     5
     6        Reviewed by Eric Carlson.
     7
     8        Covered by manual tests.
     9
     10        Add sampleRate, volume and echoCancellation parameters to the shared audio unit.
     11        Set default values when creating the shared audio unit and use those for the creation of new sources.
     12        Add support for volume.
     13        Add support for disabling echo cancellation.
     14        Check valid sample rates when trying to apply a sample rate.
     15
     16        * platform/mediastream/RealtimeMediaSource.h:
     17        * platform/mediastream/mac/CoreAudioCaptureSource.cpp:
     18        (WebCore::CoreAudioSharedUnit::volume):
     19        (WebCore::CoreAudioSharedUnit::sampleRate):
     20        (WebCore::CoreAudioSharedUnit::enableEchoCancellation):
     21        (WebCore::CoreAudioSharedUnit::setVolume):
     22        (WebCore::CoreAudioSharedUnit::setSampleRate):
     23        (WebCore::CoreAudioSharedUnit::setEnableEchoCancellation):
     24        (WebCore::CoreAudioSharedUnit::CoreAudioSharedUnit):
     25        (WebCore::CoreAudioSharedUnit::setupAudioUnits):
     26        (WebCore::CoreAudioSharedUnit::configureMicrophoneProc):
     27        (WebCore::CoreAudioSharedUnit::configureSpeakerProc):
     28        (WebCore::CoreAudioSharedUnit::processMicrophoneSamples):
     29        (WebCore::CoreAudioCaptureSource::CoreAudioCaptureSource):
     30        (WebCore::CoreAudioCaptureSource::applySampleRate):
     31        (WebCore::CoreAudioCaptureSource::applyEchoCancellation):
     32        * platform/mediastream/mac/CoreAudioCaptureSource.h:
     33
    1342017-05-08  Joanmarie Diggs  <jdiggs@igalia.com>
    235
  • trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h

    r215955 r216455  
    216216    void notifyMutedObservers() const;
    217217
     218    void initializeVolume(double volume) { m_volume = volume; }
     219    void initializeSampleRate(int sampleRate) { m_sampleRate = sampleRate; }
     220    void initializeEchoCancellation(bool echoCancellation) { m_echoCancellation = echoCancellation; }
     221
    218222    bool m_muted { false };
    219223    bool m_enabled { true };
  • trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp

    r216432 r216455  
    8181public:
    8282    static CoreAudioSharedUnit& singleton();
     83    CoreAudioSharedUnit();
    8384
    8485    void addClient(CoreAudioCaptureSource&);
     
    100101
    101102    const CAAudioStreamDescription& microphoneFormat() const { return m_microphoneProcFormat; }
     103
     104    double volume() const { return m_volume; }
     105    int sampleRate() const { return m_sampleRate; }
     106    bool enableEchoCancellation() const { return m_enableEchoCancellation; }
     107
     108    void setVolume(double volume) { m_volume = volume; }
     109    void setSampleRate(int sampleRate) { m_sampleRate = sampleRate; }
     110    void setEnableEchoCancellation(bool enableEchoCancellation) { m_enableEchoCancellation = enableEchoCancellation; }
    102111
    103112private:
     
    154163    uint64_t m_microphoneProcsCalled { 0 };
    155164#endif
     165
     166    bool m_enableEchoCancellation { true };
     167    double m_volume { 1 };
     168    int m_sampleRate;
    156169};
    157170
     
    160173    static NeverDestroyed<CoreAudioSharedUnit> singleton;
    161174    return singleton;
     175}
     176
     177CoreAudioSharedUnit::CoreAudioSharedUnit()
     178{
     179    m_sampleRate = AudioSession::sharedSession().sampleRate();
    162180}
    163181
     
    229247    }
    230248
    231     uint32_t param = m_clients.first()->echoCancellation();
    232     err = AudioUnitSetProperty(m_ioUnit, kAUVoiceIOProperty_VoiceProcessingEnableAGC, kAudioUnitScope_Global, inputBus, &param, sizeof(param));
    233     if (err) {
    234         LOG(Media, "CoreAudioCaptureSource::setupAudioUnits(%p) unable to set vpio unit echo cancellation, error %d (%.4s)", this, (int)err, (char*)&err);
    235         return err;
     249    if (!m_enableEchoCancellation) {
     250        uint32_t param = 0;
     251        err = AudioUnitSetProperty(m_ioUnit, kAUVoiceIOProperty_VoiceProcessingEnableAGC, kAudioUnitScope_Global, inputBus, &param, sizeof(param));
     252        if (err) {
     253            LOG(Media, "CoreAudioCaptureSource::setupAudioUnits(%p) unable to set vpio automatic gain control, error %d (%.4s)", this, (int)err, (char*)&err);
     254            return err;
     255        }
     256        param = 1;
     257        err = AudioUnitSetProperty(m_ioUnit, kAUVoiceIOProperty_BypassVoiceProcessing, kAudioUnitScope_Global, inputBus, &param, sizeof(param));
     258        if (err) {
     259            LOG(Media, "CoreAudioCaptureSource::setupAudioUnits(%p) unable to set vpio unit echo cancellation, error %d (%.4s)", this, (int)err, (char*)&err);
     260            return err;
     261        }
    236262    }
    237263
    238264#if PLATFORM(IOS)
    239     param = 1;
     265    uint32_t param = 1;
    240266    err = AudioUnitSetProperty(m_ioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, inputBus, &param, sizeof(param));
    241267    if (err) {
     
    293319    }
    294320
    295     microphoneProcFormat.mSampleRate = m_clients.first()->sampleRate();
     321    microphoneProcFormat.mSampleRate = m_sampleRate;
    296322    err = AudioUnitSetProperty(m_ioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, inputBus, &microphoneProcFormat, size);
    297323    if (err) {
     
    324350    }
    325351
    326     speakerProcFormat.mSampleRate = m_clients.first()->sampleRate();
     352    speakerProcFormat.mSampleRate = m_sampleRate;
    327353    err = AudioUnitSetProperty(m_ioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, outputBus, &speakerProcFormat, size);
    328354    if (err) {
     
    430456    m_microphoneSampleBuffer->setTimes(adjustedHostTime, sampleTime);
    431457
     458    if (m_volume != 1.0)
     459        m_microphoneSampleBuffer->applyGain(m_volume);
     460
    432461    for (auto* client : m_clients) {
    433462        if (client->isProducingData())
     
    599628    m_muted = true;
    600629
    601     setVolume(1.0);
    602     setSampleRate(AudioSession::sharedSession().sampleRate());
    603     setEchoCancellation(true);
    604 
    605     CoreAudioSharedUnit::singleton().addClient(*this);
     630    auto& unit = CoreAudioSharedUnit::singleton();
     631
     632    initializeEchoCancellation(unit.enableEchoCancellation());
     633    initializeSampleRate(unit.sampleRate());
     634    initializeVolume(unit.volume());
     635
     636    unit.addClient(*this);
    606637}
    607638
     
    705736}
    706737
     738bool CoreAudioCaptureSource::applySampleRate(int sampleRate)
     739{
     740    // FIXME: We should be able to describe sample rate as a discreet range constraint so that we only enter here with values that can be applied.
     741    switch (sampleRate) {
     742    case 8000:
     743    case 16000:
     744    case 32000:
     745    case 44100:
     746    case 48000:
     747    case 96000:
     748        break;
     749    default:
     750        return false;
     751    }
     752
     753    CoreAudioSharedUnit::singleton().setSampleRate(sampleRate);
     754
     755    // FIXME: do reconfiguration if audio unit is started.
     756    return true;
     757}
     758
     759bool CoreAudioCaptureSource::applyEchoCancellation(bool enableEchoCancellation)
     760{
     761    CoreAudioSharedUnit::singleton().setEnableEchoCancellation(enableEchoCancellation);
     762
     763    // FIXME: do reconfiguration if audio unit is started.
     764    return true;
     765}
     766
    707767} // namespace WebCore
    708768
  • trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h

    r216349 r216455  
    5252class WebAudioSourceProviderAVFObjC;
    5353
    54 class CoreAudioCaptureSource : public RealtimeMediaSource {
     54class CoreAudioCaptureSource final : public RealtimeMediaSource {
    5555public:
    5656
     
    8181    bool isProducingData() const final { return m_isProducingData; }
    8282
    83     bool applyVolume(double) override { return true; }
    84     bool applySampleRate(int) override { return true; }
    85     bool applyEchoCancellation(bool) override { return true; }
     83    bool applyVolume(double) final { return true; }
     84    bool applySampleRate(int) final;
     85    bool applyEchoCancellation(bool) final;
    8686
    8787    const RealtimeMediaSourceCapabilities& capabilities() const final;
Note: See TracChangeset for help on using the changeset viewer.