+ base::WaitableEvent start_signaling_event(true, false);
+ chrome_signaling_thread_.message_loop()->PostTask(FROM_HERE, base::Bind(
+ &PeerConnectionDependencyFactory::InitializeSignalingThread,
+ base::Unretained(this),
+ RenderThreadImpl::current()->GetGpuFactories(),
+ &start_signaling_event));
+
+ // TODO(xians): Remove the following code after kDisableAudioTrackProcessing
+ // is removed.
+ if (!MediaStreamAudioProcessor::IsAudioTrackProcessingEnabled()) {
+ aec_dump_message_filter_ = AecDumpMessageFilter::Get();
+ // In unit tests not creating a message filter, |aec_dump_message_filter_|
+ // will be NULL. We can just ignore that. Other unit tests and browser tests
+ // ensure that we do get the filter when we should.
+ if (aec_dump_message_filter_.get())
+ aec_dump_message_filter_->AddDelegate(this);
+ }
+
+ start_signaling_event.Wait();
+ CHECK(signaling_thread_);
+}
+
+void PeerConnectionDependencyFactory::InitializeSignalingThread(
+ const scoped_refptr<media::GpuVideoAcceleratorFactories>& gpu_factories,
+ base::WaitableEvent* event) {
+ DCHECK(chrome_signaling_thread_.task_runner()->BelongsToCurrentThread());
+ DCHECK(worker_thread_);
+ DCHECK(p2p_socket_dispatcher_.get());
+
+ jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop();
+ jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true);
+ signaling_thread_ = jingle_glue::JingleThreadWrapper::current();
+
+ EnsureWebRtcAudioDeviceImpl();
+
+ socket_factory_.reset(
+ new IpcPacketSocketFactory(p2p_socket_dispatcher_.get()));
+