Reduce redundant flags for audio stream playout state.

Bug: none
Change-Id: Idbcb19cf415dd1fadfe54d01294bb62b8ba9012f
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/202244
Reviewed-by: Jakob Ivarsson <jakobi@webrtc.org>
Commit-Queue: Tommi <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33015}
diff --git a/audio/audio_receive_stream.cc b/audio/audio_receive_stream.cc
index 54c8a02..d6f6140 100644
--- a/audio/audio_receive_stream.cc
+++ b/audio/audio_receive_stream.cc
@@ -173,6 +173,11 @@
   audio_state()->RemoveReceivingStream(this);
 }
 
+bool AudioReceiveStream::IsRunning() const {
+  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
+  return playing_;
+}
+
 webrtc::AudioReceiveStream::Stats AudioReceiveStream::GetStats(
     bool get_and_clear_legacy_stats) const {
   RTC_DCHECK_RUN_ON(&worker_thread_checker_);
diff --git a/audio/audio_receive_stream.h b/audio/audio_receive_stream.h
index 32f8b60..7cafc38 100644
--- a/audio/audio_receive_stream.h
+++ b/audio/audio_receive_stream.h
@@ -71,6 +71,8 @@
   void Reconfigure(const webrtc::AudioReceiveStream::Config& config) override;
   void Start() override;
   void Stop() override;
+  bool IsRunning() const override;
+
   webrtc::AudioReceiveStream::Stats GetStats(
       bool get_and_clear_legacy_stats) const override;
   void SetSink(AudioSinkInterface* sink) override;
diff --git a/call/audio_receive_stream.h b/call/audio_receive_stream.h
index eee62e9..c53791e 100644
--- a/call/audio_receive_stream.h
+++ b/call/audio_receive_stream.h
@@ -167,6 +167,9 @@
   // When a stream is stopped, it can't receive, process or deliver packets.
   virtual void Stop() = 0;
 
+  // Returns true if the stream has been started.
+  virtual bool IsRunning() const = 0;
+
   virtual Stats GetStats(bool get_and_clear_legacy_stats) const = 0;
   Stats GetStats() { return GetStats(/*get_and_clear_legacy_stats=*/true); }
 
diff --git a/media/engine/fake_webrtc_call.h b/media/engine/fake_webrtc_call.h
index 385bbcd7..b0d797b 100644
--- a/media/engine/fake_webrtc_call.h
+++ b/media/engine/fake_webrtc_call.h
@@ -104,6 +104,7 @@
   void Reconfigure(const webrtc::AudioReceiveStream::Config& config) override;
   void Start() override { started_ = true; }
   void Stop() override { started_ = false; }
+  bool IsRunning() const override { return started_; }
 
   webrtc::AudioReceiveStream::Stats GetStats(
       bool get_and_clear_legacy_stats) const override;
diff --git a/media/engine/webrtc_voice_engine.cc b/media/engine/webrtc_voice_engine.cc
index 2ed78b4..72871d2 100644
--- a/media/engine/webrtc_voice_engine.cc
+++ b/media/engine/webrtc_voice_engine.cc
@@ -1304,7 +1304,6 @@
     } else {
       stream_->Stop();
     }
-    playout_ = playout;
   }
 
   bool SetBaseMinimumPlayoutDelayMs(int delay_ms) {
@@ -1355,13 +1354,16 @@
  private:
   void RecreateAudioReceiveStream() {
     RTC_DCHECK(worker_thread_checker_.IsCurrent());
+    bool was_running = false;
     if (stream_) {
+      was_running = stream_->IsRunning();
       call_->DestroyAudioReceiveStream(stream_);
     }
     stream_ = call_->CreateAudioReceiveStream(config_);
     RTC_CHECK(stream_);
     stream_->SetGain(output_volume_);
-    SetPlayout(playout_);
+    if (was_running)
+      SetPlayout(was_running);
     stream_->SetSink(raw_audio_sink_.get());
   }
 
@@ -1377,7 +1379,6 @@
   // The stream is owned by WebRtcAudioReceiveStream and may be reallocated if
   // configuration changes.
   webrtc::AudioReceiveStream* stream_ = nullptr;
-  bool playout_ = false;
   float output_volume_ = 1.0;
   std::unique_ptr<webrtc::AudioSinkInterface> raw_audio_sink_;
 };
@@ -1689,21 +1690,22 @@
     return true;
   }
 
-  if (playout_) {
-    // Receive codecs can not be changed while playing. So we temporarily
-    // pause playout.
-    ChangePlayout(false);
-  }
+  bool playout_enabled = playout_;
+  // Receive codecs can not be changed while playing. So we temporarily
+  // pause playout.
+  SetPlayout(false);
+  RTC_DCHECK(!playout_);
 
   decoder_map_ = std::move(decoder_map);
   for (auto& kv : recv_streams_) {
     kv.second->SetDecoderMap(decoder_map_);
   }
+
   recv_codecs_ = codecs;
 
-  if (desired_playout_ && !playout_) {
-    ChangePlayout(desired_playout_);
-  }
+  SetPlayout(playout_enabled);
+  RTC_DCHECK_EQ(playout_, playout_enabled);
+
   return true;
 }
 
@@ -1858,12 +1860,7 @@
 }
 
 void WebRtcVoiceMediaChannel::SetPlayout(bool playout) {
-  desired_playout_ = playout;
-  return ChangePlayout(desired_playout_);
-}
-
-void WebRtcVoiceMediaChannel::ChangePlayout(bool playout) {
-  TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::ChangePlayout");
+  TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::SetPlayout");
   RTC_DCHECK(worker_thread_checker_.IsCurrent());
   if (playout_ == playout) {
     return;
diff --git a/media/engine/webrtc_voice_engine.h b/media/engine/webrtc_voice_engine.h
index c2da3b9..81254e3 100644
--- a/media/engine/webrtc_voice_engine.h
+++ b/media/engine/webrtc_voice_engine.h
@@ -276,7 +276,6 @@
   bool MuteStream(uint32_t ssrc, bool mute);
 
   WebRtcVoiceEngine* engine() { return engine_; }
-  void ChangePlayout(bool playout);
   int CreateVoEChannel();
   bool DeleteVoEChannel(int channel);
   bool SetMaxSendBitrate(int bps);
@@ -301,7 +300,6 @@
   int dtmf_payload_freq_ = -1;
   bool recv_transport_cc_enabled_ = false;
   bool recv_nack_enabled_ = false;
-  bool desired_playout_ = false;
   bool playout_ = false;
   bool send_ = false;
   webrtc::Call* const call_ = nullptr;