Bug 1221587: add per-platform prefs to control full-duplex cubeb input r=jib

This commit is contained in:
Randell Jesup 2016-01-21 11:51:36 -05:00
parent 77b17dbbcb
commit dca56b3666
6 changed files with 35 additions and 15 deletions

View File

@ -845,6 +845,7 @@ public:
bool mEchoOn;
bool mAgcOn;
bool mNoiseOn;
bool mFullDuplex;
uint32_t mEcho;
uint32_t mAgc;
uint32_t mNoise;
@ -1519,6 +1520,7 @@ MediaManager::MediaManager()
mPrefs.mHeight = 0; // adaptive default
mPrefs.mFPS = MediaEngine::DEFAULT_VIDEO_FPS;
mPrefs.mMinFPS = MediaEngine::DEFAULT_VIDEO_MIN_FPS;
mPrefs.mFullDuplex = false;
nsresult rv;
nsCOMPtr<nsIPrefService> prefs = do_GetService("@mozilla.org/preferences-service;1", &rv);
if (NS_SUCCEEDED(rv)) {
@ -1527,8 +1529,9 @@ MediaManager::MediaManager()
GetPrefs(branch, nullptr);
}
}
LOG(("%s: default prefs: %dx%d @%dfps (min %d), %dHz test tones", __FUNCTION__,
mPrefs.mWidth, mPrefs.mHeight, mPrefs.mFPS, mPrefs.mMinFPS, mPrefs.mFreq));
LOG(("%s: default prefs: %dx%d @%dfps (min %d), %dHz test tones, %sfull-duplex", __FUNCTION__,
mPrefs.mWidth, mPrefs.mHeight, mPrefs.mFPS, mPrefs.mMinFPS, mPrefs.mFreq,
mPrefs.mFullDuplex ? "" : "not "));
}
NS_IMPL_ISUPPORTS(MediaManager, nsIMediaManagerService, nsIObserver)
@ -1590,6 +1593,8 @@ MediaManager::Get() {
prefs->AddObserver("media.navigator.video.default_height", sSingleton, false);
prefs->AddObserver("media.navigator.video.default_fps", sSingleton, false);
prefs->AddObserver("media.navigator.video.default_minfps", sSingleton, false);
prefs->AddObserver("media.navigator.audio.fake_frequency", sSingleton, false);
prefs->AddObserver("media.navigator.audio.full_duplex", sSingleton, false);
}
// Prepare async shutdown
@ -2623,6 +2628,7 @@ MediaManager::GetPrefs(nsIPrefBranch *aBranch, const char *aData)
GetPref(aBranch, "media.navigator.video.default_fps", aData, &mPrefs.mFPS);
GetPref(aBranch, "media.navigator.video.default_minfps", aData, &mPrefs.mMinFPS);
GetPref(aBranch, "media.navigator.audio.fake_frequency", aData, &mPrefs.mFreq);
GetPrefBool(aBranch, "media.navigator.audio.full_duplex", aData, &mPrefs.mFullDuplex);
}
void
@ -2649,6 +2655,7 @@ MediaManager::Shutdown()
prefs->RemoveObserver("media.navigator.video.default_fps", this);
prefs->RemoveObserver("media.navigator.video.default_minfps", this);
prefs->RemoveObserver("media.navigator.audio.fake_frequency", this);
prefs->RemoveObserver("media.navigator.audio.full_duplex", this);
}
// Close off any remaining active windows.
@ -3122,10 +3129,10 @@ MediaManager::IsActivelyCapturingOrHasAPermission(uint64_t aWindowId)
void
GetUserMediaCallbackMediaStreamListener::AudioConfig(bool aEchoOn,
uint32_t aEcho,
bool aAgcOn, uint32_t aAGC,
bool aNoiseOn, uint32_t aNoise,
int32_t aPlayoutDelay)
uint32_t aEcho,
bool aAgcOn, uint32_t aAGC,
bool aNoiseOn, uint32_t aNoise,
int32_t aPlayoutDelay)
{
if (mAudioDevice) {
#ifdef MOZ_WEBRTC

View File

@ -216,6 +216,7 @@ public:
, mFPS(0)
, mMinFPS(0)
, mFreq(0)
, mFullDuplex(false)
{}
int32_t mWidth;
@ -223,6 +224,7 @@ public:
int32_t mFPS;
int32_t mMinFPS;
int32_t mFreq; // for test tones (fake:true)
bool mFullDuplex;
// mWidth and/or mHeight may be zero (=adaptive default), so use functions.

View File

@ -51,7 +51,8 @@ MediaEngineWebRTC::MediaEngineWebRTC(MediaEnginePrefs &aPrefs)
: mMutex("mozilla::MediaEngineWebRTC"),
mVoiceEngine(nullptr),
mAudioInput(nullptr),
mAudioEngineInit(false)
mAudioEngineInit(false),
mFullDuplex(aPrefs.mFullDuplex)
{
#ifndef MOZ_B2G_CAMERA
nsCOMPtr<nsIComponentRegistrar> compMgr;
@ -287,7 +288,8 @@ MediaEngineWebRTC::EnumerateAudioDevices(dom::MediaSourceEnum aMediaSource,
}
if (!mAudioInput) {
if (true /*platform_supports_full_duplex*/) {
if (mFullDuplex) {
// The platform_supports_full_duplex.
mAudioInput = new mozilla::AudioInputCubeb(mVoiceEngine);
} else {
mAudioInput = new mozilla::AudioInputWebRTC(mVoiceEngine);
@ -330,8 +332,10 @@ MediaEngineWebRTC::EnumerateAudioDevices(dom::MediaSourceEnum aMediaSource,
aASources->AppendElement(aSource.get());
} else {
AudioInput* audioinput = mAudioInput;
if (true /*platform_supports_full_duplex*/) {
// For cubeb, it has state (the selected ID
if (mFullDuplex) {
// 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);

View File

@ -526,7 +526,7 @@ private:
webrtc::VoiceEngine* mVoiceEngine;
RefPtr<mozilla::AudioInput> mAudioInput;
bool mAudioEngineInit;
bool mFullDuplex;
bool mHasTabVideoSource;
// Store devices we've already seen in a hashtable for quick return.

View File

@ -202,10 +202,11 @@ MediaEngineWebRTCMicrophoneSource::Config(bool aEchoOn, uint32_t aEcho,
bool aNoiseOn, uint32_t aNoise,
int32_t aPlayoutDelay)
{
LOG(("Audio config: aec: %d, agc: %d, noise: %d",
LOG(("Audio config: aec: %d, agc: %d, noise: %d, delay: %d",
aEchoOn ? aEcho : -1,
aAgcOn ? aAGC : -1,
aNoiseOn ? aNoise : -1));
aNoiseOn ? aNoise : -1,
aPlayoutDelay));
bool update_echo = (mEchoOn != aEchoOn);
bool update_agc = (mAgcOn != aAgcOn);

View File

@ -438,27 +438,33 @@ pref("media.getusermedia.aec_delay_agnostic", true);
pref("media.getusermedia.noise", 1);
pref("media.getusermedia.agc_enabled", false);
pref("media.getusermedia.agc", 1);
// Adjustments for OS-specific input delay (lower bound)
// Adjustments for OS-specific AudioStream+cubeb+output delay (lower bound)
// capture_delay: Adjustments for OS-specific input delay (lower bound)
// playout_delay: Adjustments for OS-specific AudioStream+cubeb+output delay (lower bound)
// 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);
#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)
pref("media.peerconnection.capture_delay", 70);
pref("media.getusermedia.playout_delay", 50);
pref("media.navigator.audio.full_duplex", false);
#else
// *BSD, others - merely a guess for now
pref("media.peerconnection.capture_delay", 50);
pref("media.getusermedia.playout_delay", 50);
pref("media.navigator.audio.full_duplex", false);
#endif
#endif