Bug 1397793 - Move MediaEngineDefault to use the MSG rate instead of something hard-coded. r?pehrsons
This is "just" for testing, but is cleaner, and skips some resampling, and is in
line with the other patches, to converge with always using MSG rate when we can.
MozReview-Commit-ID: CBQHEDQWJE3
--- a/dom/media/webrtc/MediaEngineDefault.cpp
+++ b/dom/media/webrtc/MediaEngineDefault.cpp
@@ -21,17 +21,16 @@
#ifdef MOZ_WIDGET_ANDROID
#include "nsISupportsUtils.h"
#endif
#ifdef MOZ_WEBRTC
#include "YuvStamper.h"
#endif
-#define AUDIO_RATE mozilla::MediaEngine::DEFAULT_SAMPLE_RATE
#define DEFAULT_AUDIO_TIMER_MS 10
namespace mozilla {
using namespace mozilla::gfx;
NS_IMPL_ISUPPORTS(MediaEngineDefaultVideoSource, nsITimerCallback, nsINamed)
/**
* Default video source.
@@ -327,16 +326,17 @@ MediaEngineDefaultVideoSource::NotifyPul
* Default audio source.
*/
NS_IMPL_ISUPPORTS0(MediaEngineDefaultAudioSource)
MediaEngineDefaultAudioSource::MediaEngineDefaultAudioSource()
: MediaEngineAudioSource(kReleased)
, mLastNotify(0)
+ , mFreq(1000)
{}
MediaEngineDefaultAudioSource::~MediaEngineDefaultAudioSource()
{}
void
MediaEngineDefaultAudioSource::GetName(nsAString& aName) const
{
@@ -377,20 +377,18 @@ MediaEngineDefaultAudioSource::Allocate(
}
// Mock failure for automated tests.
if (aConstraints.mDeviceId.IsString() &&
aConstraints.mDeviceId.GetAsString().EqualsASCII("bad device")) {
return NS_ERROR_FAILURE;
}
+ mFreq = aPrefs.mFreq ? aPrefs.mFreq : 1000;
mState = kAllocated;
- // generate sine wave (default 1KHz)
- mSineGenerator = new SineWaveGenerator(AUDIO_RATE,
- static_cast<uint32_t>(aPrefs.mFreq ? aPrefs.mFreq : 1000));
*aOutHandle = nullptr;
return NS_OK;
}
nsresult
MediaEngineDefaultAudioSource::Deallocate(AllocationHandle* aHandle)
{
MOZ_ASSERT(!aHandle);
@@ -404,19 +402,25 @@ MediaEngineDefaultAudioSource::Deallocat
nsresult
MediaEngineDefaultAudioSource::Start(SourceMediaStream* aStream, TrackID aID,
const PrincipalHandle& aPrincipalHandle)
{
if (mState != kAllocated) {
return NS_ERROR_FAILURE;
}
+
+ if (!mSineGenerator) {
+ // generate sine wave (default 1KHz)
+ mSineGenerator = new SineWaveGenerator(aStream->GraphRate(), mFreq);
+ }
+
// AddTrack will take ownership of segment
AudioSegment* segment = new AudioSegment();
- aStream->AddAudioTrack(aID, AUDIO_RATE, 0, segment, SourceMediaStream::ADDTRACK_QUEUED);
+ aStream->AddAudioTrack(aID, mRate, 0, segment, SourceMediaStream::ADDTRACK_QUEUED);
// Remember TrackID so we can finish later
mTrackID = aID;
mLastNotify = 0;
mState = kStarted;
return NS_OK;
}
@@ -462,17 +466,17 @@ MediaEngineDefaultAudioSource::NotifyPul
SourceMediaStream *aSource,
TrackID aID,
StreamTime aDesiredTime,
const PrincipalHandle& aPrincipalHandle)
{
MOZ_ASSERT(aID == mTrackID);
AudioSegment segment;
// avoid accumulating rounding errors
- TrackTicks desired = aSource->TimeToTicksRoundUp(AUDIO_RATE, aDesiredTime);
+ TrackTicks desired = aSource->TimeToTicksRoundUp(mRate, aDesiredTime);
TrackTicks delta = desired - mLastNotify;
mLastNotify += delta;
AppendToSegment(segment, delta, aPrincipalHandle);
aSource->AppendToTrack(mTrackID, &segment);
}
void
MediaEngineDefault::EnumerateVideoDevices(dom::MediaSourceEnum aMediaSource,
--- a/dom/media/webrtc/MediaEngineDefault.h
+++ b/dom/media/webrtc/MediaEngineDefault.h
@@ -183,18 +183,20 @@ public:
NS_DECL_THREADSAFE_ISUPPORTS
protected:
~MediaEngineDefaultAudioSource();
TrackID mTrackID;
TrackTicks mLastNotify; // Accessed in ::Start(), then on NotifyPull (from MSG thread)
+ TrackRate mRate; // ditto
+ uint32_t mFreq; // ditto
- // Created on Allocate, then accessed from NotifyPull (MSG thread)
+ // Created on Start, then accessed from NotifyPull (MSG thread)
nsAutoPtr<SineWaveGenerator> mSineGenerator;
};
class MediaEngineDefault : public MediaEngine
{
typedef MediaEngine Super;
public: