--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -669,30 +669,17 @@ public:
return stream.forget();
}
nsDOMUserMediaStream(GetUserMediaCallbackMediaStreamListener* aListener,
AudioDevice *aAudioDevice,
VideoDevice *aVideoDevice) :
mListener(aListener),
mAudioDevice(aAudioDevice),
- mVideoDevice(aVideoDevice),
- mEchoOn(true),
- mAgcOn(false),
- mNoiseOn(true),
-#ifdef MOZ_WEBRTC
- mEcho(webrtc::kEcDefault),
- mAgc(webrtc::kAgcDefault),
- mNoise(webrtc::kNsDefault),
-#else
- mEcho(0),
- mAgc(0),
- mNoise(0),
-#endif
- mPlayoutDelay(20)
+ mVideoDevice(aVideoDevice)
{}
virtual ~nsDOMUserMediaStream()
{
StopImpl();
if (GetSourceStream()) {
GetSourceStream()->Destroy();
@@ -785,31 +772,16 @@ public:
{
if (GetSourceStream()) {
GetSourceStream()->AddDirectListener(aListener);
return true; // application should ignore NotifyQueuedTrackData
}
return false;
}
- virtual void
- AudioConfig(bool aEchoOn, uint32_t aEcho,
- bool aAgcOn, uint32_t aAgc,
- bool aNoiseOn, uint32_t aNoise,
- int32_t aPlayoutDelay)
- {
- mEchoOn = aEchoOn;
- mEcho = aEcho;
- mAgcOn = aAgcOn;
- mAgc = aAgc;
- mNoiseOn = aNoiseOn;
- mNoise = aNoise;
- mPlayoutDelay = aPlayoutDelay;
- }
-
virtual void RemoveDirectListener(MediaStreamDirectListener *aListener) override
{
if (GetSourceStream()) {
GetSourceStream()->RemoveDirectListener(aListener);
}
}
virtual DOMLocalMediaStream* AsDOMLocalMediaStream() override
@@ -837,23 +809,16 @@ public:
return GetInputStream()->AsSourceStream();
}
return nullptr;
}
RefPtr<GetUserMediaCallbackMediaStreamListener> mListener;
RefPtr<AudioDevice> mAudioDevice; // so we can turn on AEC
RefPtr<VideoDevice> mVideoDevice;
- bool mEchoOn;
- bool mAgcOn;
- bool mNoiseOn;
- uint32_t mEcho;
- uint32_t mAgc;
- uint32_t mNoise;
- uint32_t mPlayoutDelay;
};
void
MediaOperationTask::ReturnCallbackError(nsresult rv, const char* errorLog)
{
MM_LOG(("%s , rv=%d", errorLog, rv));
NS_DispatchToMainThread(do_AddRef(new ReleaseMediaOperationResource(mStream.forget(),
@@ -948,57 +913,28 @@ public:
// the desired tracks in the MediaStreamGraph) or when
// DOMMediaStream::NotifyMediaStreamGraphShutdown is called.
RefPtr<DOMMediaStream> mStream;
};
NS_IMETHOD
Run()
{
-#ifdef MOZ_WEBRTC
- int32_t aec = (int32_t) webrtc::kEcUnchanged;
- int32_t agc = (int32_t) webrtc::kAgcUnchanged;
- int32_t noise = (int32_t) webrtc::kNsUnchanged;
-#else
- int32_t aec = 0, agc = 0, noise = 0;
-#endif
- bool aec_on = false, agc_on = false, noise_on = false;
- int32_t playout_delay = 0;
-
MOZ_ASSERT(NS_IsMainThread());
nsPIDOMWindow *window = static_cast<nsPIDOMWindow*>
(nsGlobalWindow::GetInnerWindowWithId(mWindowID));
// We're on main-thread, and the windowlist can only
// be invalidated from the main-thread (see OnNavigation)
StreamListeners* listeners = mManager->GetWindowListeners(mWindowID);
if (!listeners || !window || !window->GetExtantDoc()) {
// This window is no longer live. mListener has already been removed
return NS_OK;
}
-#ifdef MOZ_WEBRTC
- // Right now these configs are only of use if webrtc is available
- nsresult rv;
- nsCOMPtr<nsIPrefService> prefs = do_GetService("@mozilla.org/preferences-service;1", &rv);
- if (NS_SUCCEEDED(rv)) {
- nsCOMPtr<nsIPrefBranch> branch = do_QueryInterface(prefs);
-
- if (branch) {
- branch->GetBoolPref("media.getusermedia.aec_enabled", &aec_on);
- branch->GetIntPref("media.getusermedia.aec", &aec);
- branch->GetBoolPref("media.getusermedia.agc_enabled", &agc_on);
- branch->GetIntPref("media.getusermedia.agc", &agc);
- branch->GetBoolPref("media.getusermedia.noise_enabled", &noise_on);
- branch->GetIntPref("media.getusermedia.noise", &noise);
- branch->GetIntPref("media.getusermedia.playout_delay", &playout_delay);
- }
- }
-#endif
-
MediaStreamGraph::GraphDriverType graphDriverType =
mAudioDevice ? MediaStreamGraph::AUDIO_THREAD_DRIVER
: MediaStreamGraph::SYSTEM_THREAD_DRIVER;
MediaStreamGraph* msg =
MediaStreamGraph::GetInstance(graphDriverType,
dom::AudioChannel::Normal);
RefPtr<DOMLocalMediaStream> domStream;
@@ -1063,21 +999,16 @@ public:
// when the page is invalidated (on navigation or close).
MOZ_ASSERT(stream);
mListener->Activate(stream.forget(), mAudioDevice, mVideoDevice);
// Note: includes JS callbacks; must be released on MainThread
TracksAvailableCallback* tracksAvailableCallback =
new TracksAvailableCallback(mManager, mOnSuccess, mWindowID, domStream);
- mListener->AudioConfig(aec_on, (uint32_t) aec,
- agc_on, (uint32_t) agc,
- noise_on, (uint32_t) noise,
- playout_delay);
-
// Dispatch to the media thread to ask it to start the sources,
// because that can take a while.
// Pass ownership of domStream to the MediaOperationTask
// to ensure it's kept alive until the MediaOperationTask runs (at least).
MediaManager::PostTask(FROM_HERE,
new MediaOperationTask(MEDIA_START, mListener, domStream,
tracksAvailableCallback,
mAudioDevice, mVideoDevice,
@@ -1505,31 +1436,48 @@ MediaManager::EnumerateRawDevices(uint64
})));
}));
return p.forget();
}
MediaManager::MediaManager()
: mMediaThread(nullptr)
, mBackend(nullptr) {
- mPrefs.mFreq = 1000; // 1KHz test tone
- mPrefs.mWidth = 0; // adaptive default
- mPrefs.mHeight = 0; // adaptive default
- mPrefs.mFPS = MediaEngine::DEFAULT_VIDEO_FPS;
- mPrefs.mMinFPS = MediaEngine::DEFAULT_VIDEO_MIN_FPS;
+ mPrefs.mFreq = 1000; // 1KHz test tone
+ mPrefs.mWidth = 0; // adaptive default
+ mPrefs.mHeight = 0; // adaptive default
+ mPrefs.mFPS = MediaEngine::DEFAULT_VIDEO_FPS;
+ mPrefs.mMinFPS = MediaEngine::DEFAULT_VIDEO_MIN_FPS;
+ mPrefs.mAecOn = false;
+ mPrefs.mAgcOn = false;
+ mPrefs.mNoiseOn = false;
+#ifdef MOZ_WEBRTC
+ mPrefs.mAec = webrtc::kEcUnchanged;
+ mPrefs.mAgc = webrtc::kAgcUnchanged;
+ mPrefs.mNoise = webrtc::kNsUnchanged;
+#else
+ mPrefs.mAec = 0;
+ mPrefs.mAgc = 0;
+ mPrefs.mNoise = 0;
+#endif
+ mPrefs.mPlayoutDelay = 0;
nsresult rv;
nsCOMPtr<nsIPrefService> prefs = do_GetService("@mozilla.org/preferences-service;1", &rv);
if (NS_SUCCEEDED(rv)) {
nsCOMPtr<nsIPrefBranch> branch = do_QueryInterface(prefs);
if (branch) {
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, aec: %s,"
+ "agc: %s, noise: %s, aec level: %d, agc level: %d, noise level: %d,"
+ "playout delay: %d", __FUNCTION__, mPrefs.mWidth, mPrefs.mHeight,
+ mPrefs.mFPS, mPrefs.mMinFPS, mPrefs.mFreq, mPrefs.mAecOn ? "on" : "off",
+ mPrefs.mAgcOn ? "on": "off", mPrefs.mNoiseOn ? "on": "off", mPrefs.mAec,
+ mPrefs.mAgc, mPrefs.mNoise, mPrefs.mPlayoutDelay));
}
NS_IMPL_ISUPPORTS(MediaManager, nsIMediaManagerService, nsIObserver)
/* static */ StaticRefPtr<MediaManager> MediaManager::sSingleton;
#ifdef DEBUG
/* static */ bool
@@ -1581,16 +1529,25 @@ MediaManager::Get() {
}
// else MediaManager won't work properly and will leak (see bug 837874)
nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
if (prefs) {
prefs->AddObserver("media.navigator.video.default_width", sSingleton, false);
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);
+#ifdef MOZ_WEBRTC
+ prefs->AddObserver("media.getusermedia.aec_enabled", sSingleton, false);
+ prefs->AddObserver("media.getusermedia.aec", sSingleton, false);
+ prefs->AddObserver("media.getusermedia.agc_enabled", sSingleton, false);
+ prefs->AddObserver("media.getusermedia.agc", sSingleton, false);
+ prefs->AddObserver("media.getusermedia.noise_enabled", sSingleton, false);
+ prefs->AddObserver("media.getusermedia.noise", sSingleton, false);
+ prefs->AddObserver("media.getusermedia.playout_delay", sSingleton, false);
+#endif
}
// Prepare async shutdown
nsCOMPtr<nsIAsyncShutdownClient> shutdownPhase = GetShutdownPhase();
class Blocker : public media::ShutdownBlocker
{
@@ -2615,16 +2572,25 @@ MediaManager::GetPrefBool(nsIPrefBranch
void
MediaManager::GetPrefs(nsIPrefBranch *aBranch, const char *aData)
{
GetPref(aBranch, "media.navigator.video.default_width", aData, &mPrefs.mWidth);
GetPref(aBranch, "media.navigator.video.default_height", aData, &mPrefs.mHeight);
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);
+#ifdef MOZ_WEBRTC
+ GetPrefBool(aBranch, "media.getusermedia.aec_enabled", aData, &mPrefs.mAecOn);
+ GetPrefBool(aBranch, "media.getusermedia.agc_enabled", aData, &mPrefs.mAgcOn);
+ GetPrefBool(aBranch, "media.getusermedia.noise_enabled", aData, &mPrefs.mNoiseOn);
+ GetPref(aBranch, "media.getusermedia.aec", aData, &mPrefs.mAec);
+ GetPref(aBranch, "media.getusermedia.agc", aData, &mPrefs.mAgc);
+ GetPref(aBranch, "media.getusermedia.noise", aData, &mPrefs.mNoise);
+ GetPref(aBranch, "media.getusermedia.playout_delay", aData, &mPrefs.mPlayoutDelay);
+#endif
}
void
MediaManager::Shutdown()
{
MOZ_ASSERT(NS_IsMainThread());
if (sInShutdown) {
return;
@@ -2641,16 +2607,25 @@ MediaManager::Shutdown()
nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
if (prefs) {
prefs->RemoveObserver("media.navigator.video.default_width", this);
prefs->RemoveObserver("media.navigator.video.default_height", this);
prefs->RemoveObserver("media.navigator.video.default_fps", this);
prefs->RemoveObserver("media.navigator.video.default_minfps", this);
prefs->RemoveObserver("media.navigator.audio.fake_frequency", this);
+#ifdef MOZ_WEBRTC
+ prefs->RemoveObserver("media.getusermedia.aec_enabled", this);
+ prefs->RemoveObserver("media.getusermedia.aec", this);
+ prefs->RemoveObserver("media.getusermedia.agc_enabled", this);
+ prefs->RemoveObserver("media.getusermedia.agc", this);
+ prefs->RemoveObserver("media.getusermedia.noise_enabled", this);
+ prefs->RemoveObserver("media.getusermedia.noise", this);
+ prefs->RemoveObserver("media.getusermedia.playout_delay", this);
+#endif
}
// Close off any remaining active windows.
GetActiveWindows()->Clear();
mActiveCallbacks.Clear();
mCallIds.Clear();
// Because mMediaThread is not an nsThread, we must dispatch to it so it can
@@ -3113,33 +3088,16 @@ MediaManager::IsActivelyCapturingOrHasAP
return false;
}
}
return audio == nsIPermissionManager::ALLOW_ACTION ||
video == nsIPermissionManager::ALLOW_ACTION;
}
void
-GetUserMediaCallbackMediaStreamListener::AudioConfig(bool aEchoOn,
- uint32_t aEcho,
- bool aAgcOn, uint32_t aAGC,
- bool aNoiseOn, uint32_t aNoise,
- int32_t aPlayoutDelay)
-{
- if (mAudioDevice) {
-#ifdef MOZ_WEBRTC
- MediaManager::PostTask(FROM_HERE,
- NewRunnableMethod(mAudioDevice->GetSource(), &MediaEngineSource::Config,
- aEchoOn, aEcho, aAgcOn, aAGC, aNoiseOn,
- aNoise, aPlayoutDelay));
-#endif
- }
-}
-
-void
GetUserMediaCallbackMediaStreamListener::Invalidate()
{
MOZ_ASSERT(NS_IsMainThread(), "Only call on main thread");
if (mStopped) {
return;
}
// We can't take a chance on blocking here, so proxy this to another
--- a/dom/media/webrtc/MediaEngine.h
+++ b/dom/media/webrtc/MediaEngine.h
@@ -116,22 +116,16 @@ public:
/* Stop the device and release the corresponding MediaStream */
virtual nsresult Stop(SourceMediaStream *aSource, TrackID aID) = 0;
/* Restart with new capability */
virtual nsresult Restart(const dom::MediaTrackConstraints& aConstraints,
const MediaEnginePrefs &aPrefs,
const nsString& aDeviceId) = 0;
- /* Change device configuration. */
- virtual nsresult Config(bool aEchoOn, uint32_t aEcho,
- bool aAgcOn, uint32_t aAGC,
- bool aNoiseOn, uint32_t aNoise,
- int32_t aPlayoutDelay) = 0;
-
/* Returns true if a source represents a fake capture device and
* false otherwise
*/
virtual bool IsFake() = 0;
/* Returns the type of media source (camera, microphone, screen, window, etc) */
virtual dom::MediaSourceEnum GetMediaSource() const = 0;
@@ -211,23 +205,37 @@ protected:
class MediaEnginePrefs {
public:
MediaEnginePrefs()
: mWidth(0)
, mHeight(0)
, mFPS(0)
, mMinFPS(0)
, mFreq(0)
+ , mAecOn(false)
+ , mAgcOn(false)
+ , mNoiseOn(false)
+ , mAec(0)
+ , mAgc(0)
+ , mNoise(0)
+ , mPlayoutDelay(0)
{}
int32_t mWidth;
int32_t mHeight;
int32_t mFPS;
int32_t mMinFPS;
int32_t mFreq; // for test tones (fake:true)
+ bool mAecOn;
+ bool mAgcOn;
+ bool mNoiseOn;
+ int32_t mAec;
+ int32_t mAgc;
+ int32_t mNoise;
+ int32_t mPlayoutDelay;
// mWidth and/or mHeight may be zero (=adaptive default), so use functions.
int32_t GetWidth(bool aHD = false) const {
return mWidth? mWidth : (mHeight?
(mHeight * GetDefWidth(aHD)) / GetDefHeight(aHD) :
GetDefWidth(aHD));
}
--- a/dom/media/webrtc/MediaEngineCameraVideoSource.h
+++ b/dom/media/webrtc/MediaEngineCameraVideoSource.h
@@ -32,23 +32,16 @@ public:
, mCaptureIndex(aIndex)
, mTrackID(0)
{}
virtual void GetName(nsAString& aName) override;
virtual void GetUUID(nsACString& aUUID) override;
virtual void SetDirectListeners(bool aHasListeners) override;
- virtual nsresult Config(bool aEchoOn, uint32_t aEcho,
- bool aAgcOn, uint32_t aAGC,
- bool aNoiseOn, uint32_t aNoise,
- int32_t aPlayoutDelay) override
- {
- return NS_OK;
- };
virtual bool IsFake() override
{
return false;
}
virtual nsresult TakePhoto(PhotoCallback* aCallback) override
{
--- a/dom/media/webrtc/MediaEngineDefault.h
+++ b/dom/media/webrtc/MediaEngineDefault.h
@@ -48,20 +48,16 @@ public:
const nsString& aDeviceId) override;
virtual nsresult Deallocate() override;
virtual nsresult Start(SourceMediaStream*, TrackID) override;
virtual nsresult Stop(SourceMediaStream*, TrackID) override;
virtual nsresult Restart(const dom::MediaTrackConstraints& aConstraints,
const MediaEnginePrefs &aPrefs,
const nsString& aDeviceId) override;
virtual void SetDirectListeners(bool aHasDirectListeners) override {};
- virtual nsresult Config(bool aEchoOn, uint32_t aEcho,
- bool aAgcOn, uint32_t aAGC,
- bool aNoiseOn, uint32_t aNoise,
- int32_t aPlayoutDelay) override { return NS_OK; };
virtual void NotifyPull(MediaStreamGraph* aGraph,
SourceMediaStream *aSource,
TrackID aId,
StreamTime aDesiredTime) override;
virtual uint32_t GetBestFitnessDistance(
const nsTArray<const dom::MediaTrackConstraintSet*>& aConstraintSets,
const nsString& aDeviceId) override;
@@ -121,20 +117,16 @@ public:
const nsString& aDeviceId) override;
virtual nsresult Deallocate() override;
virtual nsresult Start(SourceMediaStream*, TrackID) override;
virtual nsresult Stop(SourceMediaStream*, TrackID) override;
virtual nsresult Restart(const dom::MediaTrackConstraints& aConstraints,
const MediaEnginePrefs &aPrefs,
const nsString& aDeviceId) override;
virtual void SetDirectListeners(bool aHasDirectListeners) override {};
- virtual nsresult Config(bool aEchoOn, uint32_t aEcho,
- bool aAgcOn, uint32_t aAGC,
- bool aNoiseOn, uint32_t aNoise,
- int32_t aPlayoutDelay) override { return NS_OK; };
void AppendToSegment(AudioSegment& aSegment, TrackTicks aSamples);
virtual void NotifyPull(MediaStreamGraph* aGraph,
SourceMediaStream *aSource,
TrackID aId,
StreamTime aDesiredTime) override
{
#ifdef DEBUG
StreamBuffer::Track* data = aSource->FindTrack(aId);
--- a/dom/media/webrtc/MediaEngineTabVideoSource.cpp
+++ b/dom/media/webrtc/MediaEngineTabVideoSource.cpp
@@ -309,21 +309,15 @@ MediaEngineTabVideoSource::Stop(mozilla:
{
if (!mWindow)
return NS_OK;
NS_DispatchToMainThread(new StopRunnable(this));
return NS_OK;
}
-nsresult
-MediaEngineTabVideoSource::Config(bool, uint32_t, bool, uint32_t, bool, uint32_t, int32_t)
-{
- return NS_OK;
-}
-
bool
MediaEngineTabVideoSource::IsFake()
{
return false;
}
}
--- a/dom/media/webrtc/MediaEngineTabVideoSource.h
+++ b/dom/media/webrtc/MediaEngineTabVideoSource.h
@@ -27,17 +27,16 @@ class MediaEngineTabVideoSource : public
virtual nsresult Deallocate() override;
virtual nsresult Start(mozilla::SourceMediaStream*, mozilla::TrackID) override;
virtual void SetDirectListeners(bool aHasDirectListeners) override {};
virtual void NotifyPull(mozilla::MediaStreamGraph*, mozilla::SourceMediaStream*, mozilla::TrackID, mozilla::StreamTime) override;
virtual nsresult Stop(mozilla::SourceMediaStream*, mozilla::TrackID) override;
virtual nsresult Restart(const dom::MediaTrackConstraints& aConstraints,
const mozilla::MediaEnginePrefs& aPrefs,
const nsString& aDeviceId) override;
- virtual nsresult Config(bool, uint32_t, bool, uint32_t, bool, uint32_t, int32_t) override;
virtual bool IsFake() override;
virtual dom::MediaSourceEnum GetMediaSource() const override {
return dom::MediaSourceEnum::Browser;
}
virtual uint32_t GetBestFitnessDistance(
const nsTArray<const dom::MediaTrackConstraintSet*>& aConstraintSets,
const nsString& aDeviceId) override
{
--- a/dom/media/webrtc/MediaEngineWebRTC.h
+++ b/dom/media/webrtc/MediaEngineWebRTC.h
@@ -84,22 +84,16 @@ public:
}
nsresult Start(SourceMediaStream* aMediaStream, TrackID aId) override;
nsresult Stop(SourceMediaStream* aMediaStream, TrackID aId) override;
nsresult Restart(const dom::MediaTrackConstraints& aConstraints,
const MediaEnginePrefs &aPrefs,
const nsString& aDeviceId) override;
void SetDirectListeners(bool aDirect) override
{}
- nsresult Config(bool aEchoOn, uint32_t aEcho, bool aAgcOn,
- uint32_t aAGC, bool aNoiseOn, uint32_t aNoise,
- int32_t aPlayoutDelay) override
- {
- return NS_OK;
- }
void NotifyPull(MediaStreamGraph* aGraph, SourceMediaStream* aSource,
TrackID aID, StreamTime aDesiredTime) override
{}
dom::MediaSourceEnum GetMediaSource() const override
{
return dom::MediaSourceEnum::AudioCapture;
}
bool IsFake() override
@@ -159,20 +153,16 @@ public:
const nsString& aDeviceId) override;
virtual nsresult Deallocate() override;
virtual nsresult Start(SourceMediaStream* aStream, TrackID aID) override;
virtual nsresult Stop(SourceMediaStream* aSource, TrackID aID) override;
virtual nsresult Restart(const dom::MediaTrackConstraints& aConstraints,
const MediaEnginePrefs &aPrefs,
const nsString& aDeviceId) override;
virtual void SetDirectListeners(bool aHasDirectListeners) override {};
- virtual nsresult Config(bool aEchoOn, uint32_t aEcho,
- bool aAgcOn, uint32_t aAGC,
- bool aNoiseOn, uint32_t aNoise,
- int32_t aPlayoutDelay) override;
virtual void NotifyPull(MediaStreamGraph* aGraph,
SourceMediaStream* aSource,
TrackID aId,
StreamTime aDesiredTime) override;
virtual bool IsFake() override {
return false;
--- a/dom/media/webrtc/MediaEngineWebRTCAudio.cpp
+++ b/dom/media/webrtc/MediaEngineWebRTCAudio.cpp
@@ -191,79 +191,16 @@ MediaEngineWebRTCMicrophoneSource::GetUU
{
if (mInitDone) {
aUUID.Assign(mDeviceUUID);
}
return;
}
-nsresult
-MediaEngineWebRTCMicrophoneSource::Config(bool aEchoOn, uint32_t aEcho,
- bool aAgcOn, uint32_t aAGC,
- bool aNoiseOn, uint32_t aNoise,
- int32_t aPlayoutDelay)
-{
- LOG(("Audio config: aec: %d, agc: %d, noise: %d",
- aEchoOn ? aEcho : -1,
- aAgcOn ? aAGC : -1,
- aNoiseOn ? aNoise : -1));
-
- bool update_echo = (mEchoOn != aEchoOn);
- bool update_agc = (mAgcOn != aAgcOn);
- bool update_noise = (mNoiseOn != aNoiseOn);
- mEchoOn = aEchoOn;
- mAgcOn = aAgcOn;
- mNoiseOn = aNoiseOn;
-
- if ((webrtc::EcModes) aEcho != webrtc::kEcUnchanged) {
- if (mEchoCancel != (webrtc::EcModes) aEcho) {
- update_echo = true;
- mEchoCancel = (webrtc::EcModes) aEcho;
- }
- }
- if ((webrtc::AgcModes) aAGC != webrtc::kAgcUnchanged) {
- if (mAGC != (webrtc::AgcModes) aAGC) {
- update_agc = true;
- mAGC = (webrtc::AgcModes) aAGC;
- }
- }
- if ((webrtc::NsModes) aNoise != webrtc::kNsUnchanged) {
- if (mNoiseSuppress != (webrtc::NsModes) aNoise) {
- update_noise = true;
- mNoiseSuppress = (webrtc::NsModes) aNoise;
- }
- }
- mPlayoutDelay = aPlayoutDelay;
-
- if (mInitDone) {
- int error;
-
- if (update_echo &&
- 0 != (error = mVoEProcessing->SetEcStatus(mEchoOn, (webrtc::EcModes) aEcho))) {
- LOG(("%s Error setting Echo Status: %d ",__FUNCTION__, error));
- // Overhead of capturing all the time is very low (<0.1% of an audio only call)
- if (mEchoOn) {
- if (0 != (error = mVoEProcessing->SetEcMetricsStatus(true))) {
- LOG(("%s Error setting Echo Metrics: %d ",__FUNCTION__, error));
- }
- }
- }
- if (update_agc &&
- 0 != (error = mVoEProcessing->SetAgcStatus(mAgcOn, (webrtc::AgcModes) aAGC))) {
- LOG(("%s Error setting AGC Status: %d ",__FUNCTION__, error));
- }
- if (update_noise &&
- 0 != (error = mVoEProcessing->SetNsStatus(mNoiseOn, (webrtc::NsModes) aNoise))) {
- LOG(("%s Error setting NoiseSuppression Status: %d ",__FUNCTION__, error));
- }
- }
- return NS_OK;
-}
-
// GetBestFitnessDistance returns the best distance the capture device can offer
// as a whole, given an accumulated number of ConstraintSets.
// Ideal values are considered in the first ConstraintSet only.
// Plain values are treated as Ideal in the first ConstraintSet.
// Plain values are treated as Exact in subsequent ConstraintSets.
// Infinity = UINT32_MAX e.g. device cannot satisfy accumulated ConstraintSets.
// A finite result may be used to calculate this device's ranking as a choice.
@@ -302,16 +239,78 @@ MediaEngineWebRTCMicrophoneSource::Alloc
MonitorAutoLock lock(mMonitor);
if (mSources.IsEmpty()) {
LOG(("Audio device %d reallocated", mCapIndex));
} else {
LOG(("Audio device %d allocated shared", mCapIndex));
}
}
++mNrAllocations;
+ return Restart(aConstraints, aPrefs, aDeviceId);
+}
+
+nsresult
+MediaEngineWebRTCMicrophoneSource::Restart(const dom::MediaTrackConstraints& aConstraints,
+ const MediaEnginePrefs &aPrefs,
+ const nsString& aDeviceId)
+{
+ LOG(("Audio config: aec: %d, agc: %d, noise: %d",
+ aPrefs.mAecOn ? aPrefs.mAec : -1,
+ aPrefs.mAgcOn ? aPrefs.mAgc : -1,
+ aPrefs.mNoiseOn ? aPrefs.mNoise : -1));
+
+ bool update_echo = (mEchoOn != aPrefs.mAecOn);
+ bool update_agc = (mAgcOn != aPrefs.mAgcOn);
+ bool update_noise = (mNoiseOn != aPrefs.mNoiseOn);
+ mEchoOn = aPrefs.mAecOn;
+ mAgcOn = aPrefs.mAgcOn;
+ mNoiseOn = aPrefs.mNoiseOn;
+
+ mPlayoutDelay = aPrefs.mPlayoutDelay;
+ if ((webrtc::EcModes) aPrefs.mAec != webrtc::kEcUnchanged) {
+ if (mEchoCancel != (webrtc::EcModes) aPrefs.mAec) {
+ update_echo = true;
+ mEchoCancel = (webrtc::EcModes) aPrefs.mAec;
+ }
+ }
+ if ((webrtc::AgcModes) aPrefs.mAgc != webrtc::kAgcUnchanged) {
+ if (mAGC != (webrtc::AgcModes) aPrefs.mAgc) {
+ update_agc = true;
+ mAGC = (webrtc::AgcModes) aPrefs.mAgc;
+ }
+ }
+ if ((webrtc::NsModes) aPrefs.mNoise != webrtc::kNsUnchanged) {
+ if (mNoiseSuppress != (webrtc::NsModes) aPrefs.mNoise) {
+ update_noise = true;
+ mNoiseSuppress = (webrtc::NsModes) aPrefs.mNoise;
+ }
+ }
+
+ if (mInitDone) {
+ int error;
+
+ if (update_echo &&
+ 0 != (error = mVoEProcessing->SetEcStatus(mEchoOn, (webrtc::EcModes) aPrefs.mAec))) {
+ LOG(("%s Error setting Echo Status: %d ",__FUNCTION__, error));
+ // Overhead of capturing all the time is very low (<0.1% of an audio only call)
+ if (mEchoOn) {
+ if (0 != (error = mVoEProcessing->SetEcMetricsStatus(true))) {
+ LOG(("%s Error setting Echo Metrics: %d ",__FUNCTION__, error));
+ }
+ }
+ }
+ if (update_agc &&
+ 0 != (error = mVoEProcessing->SetAgcStatus(mAgcOn, (webrtc::AgcModes) aPrefs.mAgc))) {
+ LOG(("%s Error setting AGC Status: %d ",__FUNCTION__, error));
+ }
+ if (update_noise &&
+ 0 != (error = mVoEProcessing->SetNsStatus(mNoiseOn, (webrtc::NsModes) aPrefs.mNoise))) {
+ LOG(("%s Error setting NoiseSuppression Status: %d ",__FUNCTION__, error));
+ }
+ }
return NS_OK;
}
nsresult
MediaEngineWebRTCMicrophoneSource::Deallocate()
{
AssertIsOnOwningThread();
--mNrAllocations;
@@ -361,22 +360,16 @@ MediaEngineWebRTCMicrophoneSource::Start
// Make sure logger starts before capture
AsyncLatencyLogger::Get(true);
// Register output observer
// XXX
MOZ_ASSERT(gFarendObserver);
gFarendObserver->Clear();
- // Configure audio processing in webrtc code
- Config(mEchoOn, webrtc::kEcUnchanged,
- mAgcOn, webrtc::kAgcUnchanged,
- mNoiseOn, webrtc::kNsUnchanged,
- mPlayoutDelay);
-
if (mVoEBase->StartReceive(mChannel)) {
return NS_ERROR_FAILURE;
}
if (mVoEBase->StartSend(mChannel)) {
return NS_ERROR_FAILURE;
}
// Attach external media processor, so this::Process will be called.
@@ -418,24 +411,16 @@ MediaEngineWebRTCMicrophoneSource::Stop(
return NS_ERROR_FAILURE;
}
if (mVoEBase->StopReceive(mChannel)) {
return NS_ERROR_FAILURE;
}
return NS_OK;
}
-nsresult
-MediaEngineWebRTCMicrophoneSource::Restart(const dom::MediaTrackConstraints& aConstraints,
- const MediaEnginePrefs &aPrefs,
- const nsString& aDeviceId)
-{
- return NS_OK;
-}
-
void
MediaEngineWebRTCMicrophoneSource::NotifyPull(MediaStreamGraph *aGraph,
SourceMediaStream *aSource,
TrackID aID,
StreamTime aDesiredTime)
{
// Ignore - we push audio data
LOG_FRAMES(("NotifyPull, desired = %ld", (int64_t) aDesiredTime));