From 8718e15a6a6dc56323e8e1ce1163da8b6eec9e9f Mon Sep 17 00:00:00 2001
From: Mischa Siekmann <45062894+gnumpi@users.noreply.github.com>
Date: Fri, 7 Jun 2024 21:43:22 +0200
Subject: [PATCH] fix: arduino media player sets wrong state for announcements
 (#6849)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 .../i2s_audio/media_player/i2s_audio_media_player.cpp | 11 ++++++++---
 .../i2s_audio/media_player/i2s_audio_media_player.h   |  2 +-
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp b/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp
index 1890e27bdf..ef494fac2e 100644
--- a/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp
+++ b/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp
@@ -27,6 +27,11 @@ void I2SAudioMediaPlayer::control(const media_player::MediaPlayerCall &call) {
       this->start();
     }
   }
+
+  if (this->state == media_player::MEDIA_PLAYER_STATE_ANNOUNCING) {
+    this->is_announcement_ = true;
+  }
+
   if (call.get_volume().has_value()) {
     this->volume = call.get_volume().value();
     this->set_volume_(volume);
@@ -171,9 +176,8 @@ void I2SAudioMediaPlayer::start_() {
   if (this->current_url_.has_value()) {
     this->audio_->connecttohost(this->current_url_.value().c_str());
     this->state = media_player::MEDIA_PLAYER_STATE_PLAYING;
-    if (this->is_announcement_.has_value()) {
-      this->state = this->is_announcement_.value() ? media_player::MEDIA_PLAYER_STATE_ANNOUNCING
-                                                   : media_player::MEDIA_PLAYER_STATE_PLAYING;
+    if (this->is_announcement_) {
+      this->state = media_player::MEDIA_PLAYER_STATE_ANNOUNCING;
     }
     this->publish_state();
   }
@@ -202,6 +206,7 @@ void I2SAudioMediaPlayer::stop_() {
   this->high_freq_.stop();
   this->state = media_player::MEDIA_PLAYER_STATE_IDLE;
   this->publish_state();
+  this->is_announcement_ = false;
 }
 
 media_player::MediaPlayerTraits I2SAudioMediaPlayer::get_traits() {
diff --git a/esphome/components/i2s_audio/media_player/i2s_audio_media_player.h b/esphome/components/i2s_audio/media_player/i2s_audio_media_player.h
index d7d9b1f74a..5afe778122 100644
--- a/esphome/components/i2s_audio/media_player/i2s_audio_media_player.h
+++ b/esphome/components/i2s_audio/media_player/i2s_audio_media_player.h
@@ -78,7 +78,7 @@ class I2SAudioMediaPlayer : public Component, public media_player::MediaPlayer,
   HighFrequencyLoopRequester high_freq_;
 
   optional<std::string> current_url_{};
-  optional<bool> is_announcement_{};
+  bool is_announcement_{false};
 };
 
 }  // namespace i2s_audio