Title: [216455] trunk/Source/WebCore
Revision
216455
Author
commit-qu...@webkit.org
Date
2017-05-08 15:12:39 -0700 (Mon, 08 May 2017)

Log Message

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

Patch by Youenn Fablet <you...@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:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (216454 => 216455)


--- trunk/Source/WebCore/ChangeLog	2017-05-08 21:51:27 UTC (rev 216454)
+++ trunk/Source/WebCore/ChangeLog	2017-05-08 22:12:39 UTC (rev 216455)
@@ -1,3 +1,36 @@
+2017-05-08  Youenn Fablet  <you...@apple.com>
+
+        CoreAudioSharedUnit should own its configuration parameters
+        https://bugs.webkit.org/show_bug.cgi?id=171812
+
+        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:
+
 2017-05-08  Joanmarie Diggs  <jdi...@igalia.com>
 
         AX: Setting aria-orientation="horizontal" on a listbox is being overridden on the Mac

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h (216454 => 216455)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h	2017-05-08 21:51:27 UTC (rev 216454)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h	2017-05-08 22:12:39 UTC (rev 216455)
@@ -215,6 +215,10 @@
 
     void notifyMutedObservers() const;
 
+    void initializeVolume(double volume) { m_volume = volume; }
+    void initializeSampleRate(int sampleRate) { m_sampleRate = sampleRate; }
+    void initializeEchoCancellation(bool echoCancellation) { m_echoCancellation = echoCancellation; }
+
     bool m_muted { false };
     bool m_enabled { true };
 

Modified: trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp (216454 => 216455)


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp	2017-05-08 21:51:27 UTC (rev 216454)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.cpp	2017-05-08 22:12:39 UTC (rev 216455)
@@ -80,6 +80,7 @@
 class CoreAudioSharedUnit {
 public:
     static CoreAudioSharedUnit& singleton();
+    CoreAudioSharedUnit();
 
     void addClient(CoreAudioCaptureSource&);
     void removeClient(CoreAudioCaptureSource&);
@@ -100,6 +101,14 @@
 
     const CAAudioStreamDescription& microphoneFormat() const { return m_microphoneProcFormat; }
 
+    double volume() const { return m_volume; }
+    int sampleRate() const { return m_sampleRate; }
+    bool enableEchoCancellation() const { return m_enableEchoCancellation; }
+
+    void setVolume(double volume) { m_volume = volume; }
+    void setSampleRate(int sampleRate) { m_sampleRate = sampleRate; }
+    void setEnableEchoCancellation(bool enableEchoCancellation) { m_enableEchoCancellation = enableEchoCancellation; }
+
 private:
     OSStatus configureSpeakerProc();
     OSStatus configureMicrophoneProc();
@@ -153,6 +162,10 @@
     uint64_t m_speakerProcsCalled { 0 };
     uint64_t m_microphoneProcsCalled { 0 };
 #endif
+
+    bool m_enableEchoCancellation { true };
+    double m_volume { 1 };
+    int m_sampleRate;
 };
 
 CoreAudioSharedUnit& CoreAudioSharedUnit::singleton()
@@ -161,6 +174,11 @@
     return singleton;
 }
 
+CoreAudioSharedUnit::CoreAudioSharedUnit()
+{
+    m_sampleRate = AudioSession::sharedSession().sampleRate();
+}
+
 void CoreAudioSharedUnit::addClient(CoreAudioCaptureSource& client)
 {
     m_clients.append(&client);
@@ -228,15 +246,23 @@
         return err;
     }
 
-    uint32_t param = m_clients.first()->echoCancellation();
-    err = AudioUnitSetProperty(m_ioUnit, kAUVoiceIOProperty_VoiceProcessingEnableAGC, kAudioUnitScope_Global, inputBus, &param, sizeof(param));
-    if (err) {
-        LOG(Media, "CoreAudioCaptureSource::setupAudioUnits(%p) unable to set vpio unit echo cancellation, error %d (%.4s)", this, (int)err, (char*)&err);
-        return err;
+    if (!m_enableEchoCancellation) {
+        uint32_t param = 0;
+        err = AudioUnitSetProperty(m_ioUnit, kAUVoiceIOProperty_VoiceProcessingEnableAGC, kAudioUnitScope_Global, inputBus, &param, sizeof(param));
+        if (err) {
+            LOG(Media, "CoreAudioCaptureSource::setupAudioUnits(%p) unable to set vpio automatic gain control, error %d (%.4s)", this, (int)err, (char*)&err);
+            return err;
+        }
+        param = 1;
+        err = AudioUnitSetProperty(m_ioUnit, kAUVoiceIOProperty_BypassVoiceProcessing, kAudioUnitScope_Global, inputBus, &param, sizeof(param));
+        if (err) {
+            LOG(Media, "CoreAudioCaptureSource::setupAudioUnits(%p) unable to set vpio unit echo cancellation, error %d (%.4s)", this, (int)err, (char*)&err);
+            return err;
+        }
     }
 
 #if PLATFORM(IOS)
-    param = 1;
+    uint32_t param = 1;
     err = AudioUnitSetProperty(m_ioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, inputBus, &param, sizeof(param));
     if (err) {
         LOG(Media, "CoreAudioCaptureSource::setupAudioUnits(%p) unable to enable vpio unit input, error %d (%.4s)", this, (int)err, (char*)&err);
@@ -292,7 +318,7 @@
         return err;
     }
 
-    microphoneProcFormat.mSampleRate = m_clients.first()->sampleRate();
+    microphoneProcFormat.mSampleRate = m_sampleRate;
     err = AudioUnitSetProperty(m_ioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, inputBus, &microphoneProcFormat, size);
     if (err) {
         LOG(Media, "CoreAudioSharedUnit::configureMicrophoneProc(%p) unable to set output stream format, error %d (%.4s)", this, (int)err, (char*)&err);
@@ -323,7 +349,7 @@
         return err;
     }
 
-    speakerProcFormat.mSampleRate = m_clients.first()->sampleRate();
+    speakerProcFormat.mSampleRate = m_sampleRate;
     err = AudioUnitSetProperty(m_ioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, outputBus, &speakerProcFormat, size);
     if (err) {
         LOG(Media, "CoreAudioSharedUnit::configureSpeakerProc(%p) unable to get input stream format, error %d (%.4s)", this, (int)err, (char*)&err);
@@ -429,6 +455,9 @@
     m_latestMicTimeStamp = sampleTime;
     m_microphoneSampleBuffer->setTimes(adjustedHostTime, sampleTime);
 
+    if (m_volume != 1.0)
+        m_microphoneSampleBuffer->applyGain(m_volume);
+
     for (auto* client : m_clients) {
         if (client->isProducingData())
             client->audioSamplesAvailable(MediaTime(sampleTime, m_microphoneProcFormat.sampleRate()), m_microphoneSampleBuffer->bufferList(), m_microphoneProcFormat, inNumberFrames);
@@ -598,11 +627,13 @@
 {
     m_muted = true;
 
-    setVolume(1.0);
-    setSampleRate(AudioSession::sharedSession().sampleRate());
-    setEchoCancellation(true);
+    auto& unit = CoreAudioSharedUnit::singleton();
 
-    CoreAudioSharedUnit::singleton().addClient(*this);
+    initializeEchoCancellation(unit.enableEchoCancellation());
+    initializeSampleRate(unit.sampleRate());
+    initializeVolume(unit.volume());
+
+    unit.addClient(*this);
 }
 
 CoreAudioCaptureSource::~CoreAudioCaptureSource()
@@ -704,6 +735,35 @@
     return m_audioSourceProvider.get();
 }
 
+bool CoreAudioCaptureSource::applySampleRate(int sampleRate)
+{
+    // 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.
+    switch (sampleRate) {
+    case 8000:
+    case 16000:
+    case 32000:
+    case 44100:
+    case 48000:
+    case 96000:
+        break;
+    default:
+        return false;
+    }
+
+    CoreAudioSharedUnit::singleton().setSampleRate(sampleRate);
+
+    // FIXME: do reconfiguration if audio unit is started.
+    return true;
+}
+
+bool CoreAudioCaptureSource::applyEchoCancellation(bool enableEchoCancellation)
+{
+    CoreAudioSharedUnit::singleton().setEnableEchoCancellation(enableEchoCancellation);
+
+    // FIXME: do reconfiguration if audio unit is started.
+    return true;
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h (216454 => 216455)


--- trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h	2017-05-08 21:51:27 UTC (rev 216454)
+++ trunk/Source/WebCore/platform/mediastream/mac/CoreAudioCaptureSource.h	2017-05-08 22:12:39 UTC (rev 216455)
@@ -51,7 +51,7 @@
 class CaptureDeviceInfo;
 class WebAudioSourceProviderAVFObjC;
 
-class CoreAudioCaptureSource : public RealtimeMediaSource {
+class CoreAudioCaptureSource final : public RealtimeMediaSource {
 public:
 
     static CaptureSourceOrError create(const String& deviceID, const MediaConstraints*);
@@ -80,9 +80,9 @@
     void stopProducingData() final;
     bool isProducingData() const final { return m_isProducingData; }
 
-    bool applyVolume(double) override { return true; }
-    bool applySampleRate(int) override { return true; }
-    bool applyEchoCancellation(bool) override { return true; }
+    bool applyVolume(double) final { return true; }
+    bool applySampleRate(int) final;
+    bool applyEchoCancellation(bool) final;
 
     const RealtimeMediaSourceCapabilities& capabilities() const final;
     const RealtimeMediaSourceSettings& settings() const final;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to