Unrevert 5590 "description"(=(Auto)update libjingle 61834300->61901702).

BUG=N/A
R=xians@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/9009004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5595 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/media/webrtc/webrtcvoiceengine.cc b/talk/media/webrtc/webrtcvoiceengine.cc
index e2415cf..8db8c99 100644
--- a/talk/media/webrtc/webrtcvoiceengine.cc
+++ b/talk/media/webrtc/webrtcvoiceengine.cc
@@ -1675,10 +1675,12 @@
 
   // Starts the rendering by setting a sink to the renderer to get data
   // callback.
+  // This method is called on the libjingle worker thread.
   // TODO(xians): Make sure Start() is called only once.
   void Start(AudioRenderer* renderer) {
+    talk_base::CritScope lock(&lock_);
     ASSERT(renderer != NULL);
-    if (renderer_) {
+    if (renderer_ != NULL) {
       ASSERT(renderer_ == renderer);
       return;
     }
@@ -1692,8 +1694,10 @@
 
   // Stops rendering by setting the sink of the renderer to NULL. No data
   // callback will be received after this method.
+  // This method is called on the libjingle worker thread.
   void Stop() {
-    if (!renderer_)
+    talk_base::CritScope lock(&lock_);
+    if (renderer_ == NULL)
       return;
 
     renderer_->RemoveChannel(channel_);
@@ -1702,13 +1706,29 @@
   }
 
   // AudioRenderer::Sink implementation.
+  // This method is called on the audio thread.
   virtual void OnData(const void* audio_data,
                       int bits_per_sample,
                       int sample_rate,
                       int number_of_channels,
                       int number_of_frames) OVERRIDE {
-    // TODO(xians): Make new interface in AudioTransport to pass the data to
-    // WebRtc VoE channel.
+#ifdef USE_WEBRTC_DEV_BRANCH
+    voe_audio_transport_->OnData(channel_,
+                                 audio_data,
+                                 bits_per_sample,
+                                 sample_rate,
+                                 number_of_channels,
+                                 number_of_frames);
+#endif
+  }
+
+  // Callback from the |renderer_| when it is going away. In case Start() has
+  // never been called, this callback won't be triggered.
+  virtual void OnClose() OVERRIDE {
+    talk_base::CritScope lock(&lock_);
+    // Set |renderer_| to NULL to make sure no more callback will get into
+    // the renderer.
+    renderer_ = NULL;
   }
 
   // Accessor to the VoE channel ID.
@@ -1722,6 +1742,9 @@
   // PeerConnection will make sure invalidating the pointer before the object
   // goes away.
   AudioRenderer* renderer_;
+
+  // Protects |renderer_| in Start(), Stop() and OnClose().
+  talk_base::CriticalSection lock_;
 };
 
 // WebRtcVoiceMediaChannel