зеркало из https://github.com/mozilla/gecko-dev.git
Bug 817488 Audio Send and Recv support for PC tests r=ekr
This commit is contained in:
Родитель
15150b5618
Коммит
1bd5fe4a2b
|
@ -95,13 +95,46 @@ class Fake_SourceMediaStream : public Fake_MediaStream {
|
|||
public:
|
||||
Fake_SourceMediaStream() : mSegmentsAdded(0),
|
||||
mPullEnabled(false),
|
||||
mStop(false),
|
||||
mPeriodic(new Fake_MediaPeriodic(this)) {}
|
||||
|
||||
void AddTrack(mozilla::TrackID aID, mozilla::TrackRate aRate, mozilla::TrackTicks aStart,
|
||||
mozilla::MediaSegment* aSegment) {}
|
||||
|
||||
void AppendToTrack(mozilla::TrackID aID, mozilla::MediaSegment* aSegment) {
|
||||
++mSegmentsAdded;
|
||||
bool nonZeroSample = false;
|
||||
MOZ_ASSERT(aSegment);
|
||||
if(aSegment->GetType() == mozilla::MediaSegment::AUDIO) {
|
||||
//On audio segment append, we verify for validity
|
||||
//of the audio samples.
|
||||
mozilla::AudioSegment* audio =
|
||||
static_cast<mozilla::AudioSegment*>(aSegment);
|
||||
mozilla::AudioSegment::ChunkIterator iter(*audio);
|
||||
while(!iter.IsEnded()) {
|
||||
mozilla::AudioChunk& chunk = *(iter);
|
||||
MOZ_ASSERT(chunk.mBuffer);
|
||||
const int16_t* buf =
|
||||
static_cast<const int16_t*>(chunk.mBuffer->Data());
|
||||
for(int i=0; i<chunk.mDuration; i++) {
|
||||
if(buf[i]) {
|
||||
//atleast one non-zero sample found.
|
||||
nonZeroSample = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//process next chunk
|
||||
iter.Next();
|
||||
}
|
||||
if(nonZeroSample) {
|
||||
//we increment segments count if
|
||||
//atleast one non-zero samples was found.
|
||||
++mSegmentsAdded;
|
||||
}
|
||||
} else {
|
||||
//in the case of video segment appended, we just increase the
|
||||
//segment count.
|
||||
++mSegmentsAdded;
|
||||
}
|
||||
}
|
||||
|
||||
void AdvanceKnownTracksTime(mozilla::StreamTime aKnownTime) {}
|
||||
|
@ -109,6 +142,10 @@ class Fake_SourceMediaStream : public Fake_MediaStream {
|
|||
void SetPullEnabled(bool aEnabled) {
|
||||
mPullEnabled = aEnabled;
|
||||
}
|
||||
//Don't pull anymore data,if mStop is true.
|
||||
void StopStream() {
|
||||
mStop = true;
|
||||
}
|
||||
|
||||
virtual Fake_SourceMediaStream *AsSourceStream() { return this; }
|
||||
|
||||
|
@ -124,6 +161,7 @@ class Fake_SourceMediaStream : public Fake_MediaStream {
|
|||
protected:
|
||||
int mSegmentsAdded;
|
||||
bool mPullEnabled;
|
||||
bool mStop;
|
||||
nsRefPtr<Fake_MediaPeriodic> mPeriodic;
|
||||
nsCOMPtr<nsITimer> mTimer;
|
||||
};
|
||||
|
@ -202,9 +240,17 @@ class Fake_MediaStreamBase : public Fake_MediaStream {
|
|||
|
||||
class Fake_AudioStreamSource : public Fake_MediaStreamBase {
|
||||
public:
|
||||
Fake_AudioStreamSource() : Fake_MediaStreamBase() {}
|
||||
|
||||
Fake_AudioStreamSource() : Fake_MediaStreamBase(),
|
||||
mCount(0),
|
||||
mStop(false) {}
|
||||
//Signaling Agent indicates us to stop generating
|
||||
//further audio.
|
||||
void StopStream() {
|
||||
mStop = true;
|
||||
}
|
||||
virtual void Periodic();
|
||||
int mCount;
|
||||
bool mStop;
|
||||
};
|
||||
|
||||
class Fake_VideoStreamSource : public Fake_MediaStreamBase {
|
||||
|
|
|
@ -10,6 +10,9 @@
|
|||
#include "nspr.h"
|
||||
#include "nsError.h"
|
||||
|
||||
static const int AUDIO_BUFFER_SIZE = 1600;
|
||||
static const int NUM_CHANNELS = 2;
|
||||
|
||||
NS_IMPL_THREADSAFE_ISUPPORTS1(Fake_nsDOMMediaStream, nsIDOMMediaStream)
|
||||
|
||||
// DOM Media stream
|
||||
|
@ -42,7 +45,10 @@ nsresult Fake_SourceMediaStream::Stop() {
|
|||
}
|
||||
|
||||
void Fake_SourceMediaStream::Periodic() {
|
||||
if (mPullEnabled) {
|
||||
// Pull more audio-samples iff pulling is enabled
|
||||
// and we are not asked by the signaling agent to stop
|
||||
//pulling data.
|
||||
if (mPullEnabled && !mStop) {
|
||||
for (std::set<Fake_MediaStreamListener *>::iterator it =
|
||||
mListeners.begin(); it != mListeners.end(); ++it) {
|
||||
(*it)->NotifyPull(NULL, mozilla::MillisecondsToMediaTime(10));
|
||||
|
@ -50,7 +56,6 @@ void Fake_SourceMediaStream::Periodic() {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// Fake_MediaStreamBase
|
||||
nsresult Fake_MediaStreamBase::Start() {
|
||||
mTimer = do_CreateInstance(NS_TIMER_CONTRACTID);
|
||||
|
@ -71,11 +76,29 @@ nsresult Fake_MediaStreamBase::Stop() {
|
|||
|
||||
// Fake_AudioStreamSource
|
||||
void Fake_AudioStreamSource::Periodic() {
|
||||
//Are we asked to stop pumping audio samples ?
|
||||
if(mStop) {
|
||||
return;
|
||||
}
|
||||
//Generate Signed 16 Bit Audio samples
|
||||
nsRefPtr<mozilla::SharedBuffer> samples =
|
||||
mozilla::SharedBuffer::Create(AUDIO_BUFFER_SIZE * NUM_CHANNELS * sizeof(int16_t));
|
||||
for(int i=0; i<(1600*2); i++) {
|
||||
//saw tooth audio sample
|
||||
reinterpret_cast<int16_t *>(samples->Data())[i] =
|
||||
((mCount % 8) * 4000) - (7*4000)/2;
|
||||
mCount++;
|
||||
}
|
||||
|
||||
mozilla::AudioSegment segment;
|
||||
segment.Init(1);
|
||||
segment.InsertNullDataAtStart(160);
|
||||
segment.AppendFrames(samples.forget(),
|
||||
AUDIO_BUFFER_SIZE,
|
||||
0,
|
||||
AUDIO_BUFFER_SIZE,
|
||||
mozilla::AUDIO_FORMAT_S16);
|
||||
|
||||
for (std::set<Fake_MediaStreamListener *>::iterator it = mListeners.begin();
|
||||
for(std::set<Fake_MediaStreamListener *>::iterator it = mListeners.begin();
|
||||
it != mListeners.end(); ++it) {
|
||||
(*it)->NotifyQueuedTrackChanges(NULL, // Graph
|
||||
0, // TrackID
|
||||
|
|
|
@ -677,6 +677,22 @@ void CreateAnswer(sipcc::MediaConstraints& constraints, std::string offer,
|
|||
domMediaStream_->GetStream())->GetSegmentsAdded();
|
||||
}
|
||||
|
||||
//Stops generating new audio data for transmission.
|
||||
//Should be called before Cleanup of the peer connection.
|
||||
void CloseSendStreams() {
|
||||
static_cast<Fake_AudioStreamSource*>(
|
||||
domMediaStream_->GetStream())->StopStream();
|
||||
}
|
||||
|
||||
//Stops pulling audio data off the receivers.
|
||||
//Should be called before Cleanup of the peer connection.
|
||||
void CloseReceiveStreams() {
|
||||
std::vector<nsDOMMediaStream *> streams =
|
||||
pObserver->GetStreams();
|
||||
for(int i=0; i < streams.size(); i++) {
|
||||
streams[i]->GetStream()->AsSourceStream()->StopStream();
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
mozilla::RefPtr<sipcc::PeerConnectionImpl> pc;
|
||||
|
@ -1189,6 +1205,8 @@ TEST_F(SignalingTest, OfferModifiedAnswer)
|
|||
OfferModifiedAnswer(constraints, constraints, SHOULD_SENDRECV_AV,
|
||||
SHOULD_SENDRECV_AV);
|
||||
PR_Sleep(kDefaultTimeout * 2); // Wait for completion
|
||||
a1_.CloseSendStreams();
|
||||
a2_.CloseReceiveStreams();
|
||||
}
|
||||
|
||||
TEST_F(SignalingTest, FullCall)
|
||||
|
@ -1199,6 +1217,8 @@ TEST_F(SignalingTest, FullCall)
|
|||
|
||||
PR_Sleep(kDefaultTimeout * 2); // Wait for some data to get written
|
||||
|
||||
a1_.CloseSendStreams();
|
||||
a2_.CloseReceiveStreams();
|
||||
// Check that we wrote a bunch of data
|
||||
ASSERT_GE(a1_.GetPacketsSent(0), 40);
|
||||
//ASSERT_GE(a2_.GetPacketsSent(0), 40);
|
||||
|
@ -1214,6 +1234,8 @@ TEST_F(SignalingTest, FullCallTrickle)
|
|||
|
||||
PR_Sleep(kDefaultTimeout * 2); // Wait for some data to get written
|
||||
|
||||
a1_.CloseSendStreams();
|
||||
a2_.CloseReceiveStreams();
|
||||
ASSERT_GE(a1_.GetPacketsSent(0), 40);
|
||||
ASSERT_GE(a2_.GetPacketsReceived(0), 40);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче