Bug 817488 Audio Send and Recv support for PC tests r=ekr

This commit is contained in:
Suhas Nandakumar 2012-12-05 13:37:32 -08:00
Родитель 15150b5618
Коммит 1bd5fe4a2b
3 изменённых файлов: 98 добавлений и 7 удалений

Просмотреть файл

@ -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);
}