Bug 1243857 - Enable duplex audio for Windows/WASAPI. r?jesup draft
authorPaul Adenot <paul@paul.cx>
Wed, 30 Mar 2016 17:21:16 +0200
changeset 345927 839890bd984e49b414dbf702994d211da5b5b776
parent 345859 6a1f2cf57db5cc4b76c0113c9308d5c37d328cf3
child 345928 408fd5a3b5d3a0116aafd8331c607c00672d1a18
push id14192
push userpaul@paul.cx
push dateWed, 30 Mar 2016 15:21:41 +0000
reviewersjesup
bugs1243857
milestone48.0a1
Bug 1243857 - Enable duplex audio for Windows/WASAPI. r?jesup MozReview-Commit-ID: 4h1JTGSHr2v
dom/media/webrtc/MediaEngineWebRTC.cpp
dom/media/webrtc/MediaEngineWebRTC.h
modules/libpref/init/all.js
--- a/dom/media/webrtc/MediaEngineWebRTC.cpp
+++ b/dom/media/webrtc/MediaEngineWebRTC.cpp
@@ -7,16 +7,19 @@
 #include "nsIPrefService.h"
 #include "nsIPrefBranch.h"
 #include "CamerasUtils.h"
 
 #include "CSFLog.h"
 #include "prenv.h"
 
 #include "mozilla/Logging.h"
+#ifdef XP_WIN
+#include "mozilla/WindowsVersion.h"
+#endif
 
 static mozilla::LogModule*
 GetUserMediaLog()
 {
   static mozilla::LazyLogModule sLog("GetUserMedia");
   return sLog;
 }
 
@@ -283,16 +286,26 @@ MediaEngineWebRTC::EnumerateVideoDevices
   }
 
   if (mHasTabVideoSource || dom::MediaSourceEnum::Browser == aMediaSource) {
     aVSources->AppendElement(new MediaEngineTabVideoSource());
   }
 #endif
 }
 
+bool
+MediaEngineWebRTC::SupportsDuplex()
+{
+#ifndef XP_WIN
+  return mFullDuplex;
+#else
+  return IsVistaOrLater() && mFullDuplex;
+#endif
+}
+
 void
 MediaEngineWebRTC::EnumerateAudioDevices(dom::MediaSourceEnum aMediaSource,
                                          nsTArray<RefPtr<MediaEngineAudioSource> >* aASources)
 {
   ScopedCustomReleasePtr<webrtc::VoEBase> ptrVoEBase;
   // We spawn threads to handle gUM runnables, so we must protect the member vars
   MutexAutoLock lock(mMutex);
 
@@ -332,17 +345,17 @@ MediaEngineWebRTC::EnumerateAudioDevices
   if (!mAudioEngineInit) {
     if (ptrVoEBase->Init() < 0) {
       return;
     }
     mAudioEngineInit = true;
   }
 
   if (!mAudioInput) {
-    if (mFullDuplex) {
+    if (SupportsDuplex()) {
       // The platform_supports_full_duplex.
       mAudioInput = new mozilla::AudioInputCubeb(mVoiceEngine);
     } else {
       mAudioInput = new mozilla::AudioInputWebRTC(mVoiceEngine);
     }
   }
 
   int nDevices = 0;
@@ -376,17 +389,17 @@ MediaEngineWebRTC::EnumerateAudioDevices
 
     RefPtr<MediaEngineAudioSource> aSource;
     NS_ConvertUTF8toUTF16 uuid(uniqueId);
     if (mAudioSources.Get(uuid, getter_AddRefs(aSource))) {
       // We've already seen this device, just append.
       aASources->AppendElement(aSource.get());
     } else {
       AudioInput* audioinput = mAudioInput;
-      if (mFullDuplex) {
+      if (SupportsDuplex()) {
         // The platform_supports_full_duplex.
 
         // For cubeb, it has state (the selected ID)
         // XXX just use the uniqueID for cubeb and support it everywhere, and get rid of this
         // XXX Small window where the device list/index could change!
         audioinput = new mozilla::AudioInputCubeb(mVoiceEngine, i);
       }
       aSource = new MediaEngineWebRTCMicrophoneSource(mThread, mVoiceEngine, audioinput,
--- a/dom/media/webrtc/MediaEngineWebRTC.h
+++ b/dom/media/webrtc/MediaEngineWebRTC.h
@@ -527,16 +527,19 @@ class MediaEngineWebRTC : public MediaEn
 {
 public:
   explicit MediaEngineWebRTC(MediaEnginePrefs& aPrefs);
 
   // Clients should ensure to clean-up sources video/audio sources
   // before invoking Shutdown on this class.
   void Shutdown() override;
 
+  // Returns whether the host supports duplex audio stream.
+  bool SupportsDuplex();
+
   void EnumerateVideoDevices(dom::MediaSourceEnum,
                              nsTArray<RefPtr<MediaEngineVideoSource>>*) override;
   void EnumerateAudioDevices(dom::MediaSourceEnum,
                              nsTArray<RefPtr<MediaEngineAudioSource>>*) override;
 private:
   ~MediaEngineWebRTC() {
     Shutdown();
 #if defined(MOZ_B2G_CAMERA) && defined(MOZ_WIDGET_GONK)
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -447,17 +447,17 @@ pref("media.getusermedia.agc", 1);
 // full_duplex: enable cubeb full-duplex capture/playback
 #if defined(XP_MACOSX)
 pref("media.peerconnection.capture_delay", 50);
 pref("media.getusermedia.playout_delay", 10);
 pref("media.navigator.audio.full_duplex", false);
 #elif defined(XP_WIN)
 pref("media.peerconnection.capture_delay", 50);
 pref("media.getusermedia.playout_delay", 40);
-pref("media.navigator.audio.full_duplex", false);
+pref("media.navigator.audio.full_duplex", true);
 #elif defined(ANDROID)
 pref("media.peerconnection.capture_delay", 100);
 pref("media.getusermedia.playout_delay", 100);
 pref("media.navigator.audio.full_duplex", false);
 // Whether to enable Webrtc Hardware acceleration support
 pref("media.navigator.hardware.vp8_encode.acceleration_enabled", false);
 pref("media.navigator.hardware.vp8_decode.acceleration_enabled", false);
 #elif defined(XP_LINUX)