Bug 1656438 - Simplify TestAudioTrackGraph.CrossGraphPort. r=padenot

Depends on D89748

Differential Revision: https://phabricator.services.mozilla.com/D89749
This commit is contained in:
Andreas Pehrson 2020-09-15 11:54:06 +00:00
Родитель 899f122462
Коммит 09e83dfc41
2 изменённых файлов: 58 добавлений и 67 удалений

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

@ -145,6 +145,8 @@ class MockCubebStream {
cubeb_data_callback aDataCallback,
cubeb_state_callback aStateCallback, void* aUserPtr)
: context(aContext),
mHasInput(aInputStreamParams),
mHasOutput(aOutputStreamParams),
mDataCallback(aDataCallback),
mStateCallback(aStateCallback),
mUserPtr(aUserPtr),
@ -256,6 +258,9 @@ class MockCubebStream {
public:
cubeb* context = nullptr;
const bool mHasInput;
const bool mHasOutput;
private:
// Thread that simulates the audio thread.
std::unique_ptr<std::thread> mFakeAudioThread;

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

@ -346,23 +346,15 @@ TEST(TestAudioTrackGraph, CrossGraphPort)
MockCubeb* cubeb = new MockCubeb();
CubebUtils::ForceSetCubebContext(cubeb->AsCubebContext());
/* Primary graph: Create the graph a SourceMediaTrack. */
/* Primary graph: Create the graph and a SourceMediaTrack. */
MediaTrackGraph* primary = MediaTrackGraph::GetInstance(
MediaTrackGraph::AUDIO_THREAD_DRIVER, /*window*/ nullptr,
MediaTrackGraph::REQUEST_DEFAULT_SAMPLE_RATE, nullptr);
RefPtr<SourceMediaTrack> sourceTrack =
primary->CreateSourceTrack(MediaSegment::AUDIO);
{
// Wait for the primary output stream to be created.
bool done = false;
MediaEventListener onStreamInit = cubeb->StreamInitEvent().Connect(
AbstractThread::GetCurrent(), [&] { done = true; });
SpinEventLoopUntil<ProcessFailureBehavior::IgnoreAndContinue>(
[&] { return done; });
onStreamInit.Disconnect();
}
RefPtr<SourceMediaTrack> sourceTrack;
DispatchFunction(
[&] { sourceTrack = primary->CreateSourceTrack(MediaSegment::AUDIO); });
WaitFor(cubeb->StreamInitEvent());
/* Partner graph: Create graph and the CrossGraphReceiver. */
MediaTrackGraph* partner = MediaTrackGraph::GetInstance(
@ -370,65 +362,61 @@ TEST(TestAudioTrackGraph, CrossGraphPort)
MediaTrackGraph::REQUEST_DEFAULT_SAMPLE_RATE,
/*OutputDeviceID*/ reinterpret_cast<cubeb_devid>(1));
RefPtr<CrossGraphReceiver> receiver =
partner->CreateCrossGraphReceiver(primary->GraphRate());
RefPtr<CrossGraphReceiver> receiver;
RefPtr<CrossGraphTransmitter> transmitter;
RefPtr<MediaInputPort> port;
RefPtr<AudioInputProcessing> listener;
RefPtr<AudioInputProcessingPullListener> pullListener;
DispatchFunction([&] {
receiver = partner->CreateCrossGraphReceiver(primary->GraphRate());
/* Primary graph: Create CrossGraphTransmitter */
RefPtr<CrossGraphTransmitter> transmitter =
primary->CreateCrossGraphTransmitter(receiver);
transmitter = primary->CreateCrossGraphTransmitter(receiver);
/* How the source track connects to another ProcessedMediaTrack.
* Check in MediaManager how it is connected to AudioStreamTrack. */
RefPtr<MediaInputPort> port = transmitter->AllocateInputPort(sourceTrack);
port = transmitter->AllocateInputPort(sourceTrack);
receiver->AddAudioOutput((void*)1);
/* Primary graph: Open Audio Input through SourceMediaTrack */
RefPtr<AudioInputProcessing> listener =
new AudioInputProcessing(2, sourceTrack, PRINCIPAL_HANDLE_NONE);
listener = new AudioInputProcessing(2, sourceTrack, PRINCIPAL_HANDLE_NONE);
listener->SetPassThrough(true);
RefPtr<AudioInputProcessingPullListener> pullListener =
new AudioInputProcessingPullListener(listener);
pullListener = new AudioInputProcessingPullListener(listener);
sourceTrack->AddListener(pullListener);
sourceTrack->GraphImpl()->AppendMessage(
MakeUnique<StartInputProcessing>(listener));
sourceTrack->SetPullingEnabled(true);
// Device id does not matter ignore.
// Device id does not matter. Ignore.
sourceTrack->OpenAudioInput((void*)1, listener);
MockCubebStream* stream = nullptr;
{
// Wait for the primary full-duplex stream to be created.
MediaEventListener onStreamInit = cubeb->StreamInitEvent().Connect(
AbstractThread::GetCurrent(),
[&](MockCubebStream* aStream) { stream = aStream; });
SpinEventLoopUntil<ProcessFailureBehavior::IgnoreAndContinue>(
[&] { return !!stream; });
onStreamInit.Disconnect();
}
{
// Wait for half a second worth of audio data.
uint32_t totalFrames = 0;
MediaEventListener onFrames = stream->FramesProcessedEvent().Connect(
AbstractThread::GetCurrent(),
[&](uint32_t aFrames) { totalFrames += aFrames; });
stream->GoFaster();
SpinEventLoopUntil<ProcessFailureBehavior::IgnoreAndContinue>([&] {
return totalFrames > static_cast<uint32_t>(primary->GraphRate() / 2);
});
stream->DontGoFaster();
onFrames.Disconnect();
MockCubebStream* inputStream = nullptr;
MockCubebStream* partnerStream = nullptr;
// Wait for the streams to be created.
WaitUntil(cubeb->StreamInitEvent(), [&](MockCubebStream* aStream) {
if (aStream->mHasInput) {
inputStream = aStream;
} else {
partnerStream = aStream;
}
return inputStream && partnerStream;
});
{
// Wait for the full-duplex stream to be destroyed.
bool done = false;
MediaEventListener onStreamDestroy = cubeb->StreamDestroyEvent().Connect(
AbstractThread::GetCurrent(), [&] { done = true; });
// Wait for half a second worth of audio data on the receiver stream.
uint32_t totalFrames = 0;
inputStream->GoFaster();
partnerStream->GoFaster();
WaitUntil(partnerStream->FramesProcessedEvent(), [&](uint32_t aFrames) {
totalFrames += aFrames;
return totalFrames > static_cast<uint32_t>(partner->GraphRate() / 2);
});
inputStream->DontGoFaster();
partnerStream->DontGoFaster();
DispatchFunction([&] {
// Clean up on MainThread
receiver->RemoveAudioOutput((void*)1);
receiver->Destroy();
@ -442,9 +430,7 @@ TEST(TestAudioTrackGraph, CrossGraphPort)
Some(reinterpret_cast<CubebUtils::AudioDeviceID>(1));
sourceTrack->CloseAudioInput(id);
sourceTrack->Destroy();
});
SpinEventLoopUntil<ProcessFailureBehavior::IgnoreAndContinue>(
[&] { return done; });
onStreamDestroy.Disconnect();
}
WaitFor(cubeb->StreamDestroyEvent());
}