mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	[i2s_audio] Bugfix: crashes when unlocking i2s bus multiple times (#9100)
This commit is contained in:
		| @@ -136,6 +136,7 @@ bool I2SAudioMicrophone::start_driver_() { | |||||||
|   if (!this->parent_->try_lock()) { |   if (!this->parent_->try_lock()) { | ||||||
|     return false;  // Waiting for another i2s to return lock |     return false;  // Waiting for another i2s to return lock | ||||||
|   } |   } | ||||||
|  |   this->locked_driver_ = true; | ||||||
|   esp_err_t err; |   esp_err_t err; | ||||||
|  |  | ||||||
| #ifdef USE_I2S_LEGACY | #ifdef USE_I2S_LEGACY | ||||||
| @@ -340,7 +341,10 @@ void I2SAudioMicrophone::stop_driver_() { | |||||||
|     this->rx_handle_ = nullptr; |     this->rx_handle_ = nullptr; | ||||||
|   } |   } | ||||||
| #endif | #endif | ||||||
|   this->parent_->unlock(); |   if (this->locked_driver_) { | ||||||
|  |     this->parent_->unlock(); | ||||||
|  |     this->locked_driver_ = false; | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| void I2SAudioMicrophone::mic_task(void *params) { | void I2SAudioMicrophone::mic_task(void *params) { | ||||||
| @@ -482,7 +486,8 @@ void I2SAudioMicrophone::loop() { | |||||||
|       } |       } | ||||||
|  |  | ||||||
|       if (!this->start_driver_()) { |       if (!this->start_driver_()) { | ||||||
|         this->status_momentary_error("Driver failed to start; retrying in 1 second", 1000); |         ESP_LOGE(TAG, "Driver failed to start; retrying in 1 second"); | ||||||
|  |         this->status_momentary_error("driver_fail", 1000); | ||||||
|         this->stop_driver_();  // Stop/frees whatever possibly started |         this->stop_driver_();  // Stop/frees whatever possibly started | ||||||
|         break; |         break; | ||||||
|       } |       } | ||||||
| @@ -492,7 +497,8 @@ void I2SAudioMicrophone::loop() { | |||||||
|                     &this->task_handle_); |                     &this->task_handle_); | ||||||
|  |  | ||||||
|         if (this->task_handle_ == nullptr) { |         if (this->task_handle_ == nullptr) { | ||||||
|           this->status_momentary_error("Task failed to start, retrying in 1 second", 1000); |           ESP_LOGE(TAG, "Task failed to start, retrying in 1 second"); | ||||||
|  |           this->status_momentary_error("task_fail", 1000); | ||||||
|           this->stop_driver_();  // Stops the driver to return the lock; will be reloaded in next attempt |           this->stop_driver_();  // Stops the driver to return the lock; will be reloaded in next attempt | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|   | |||||||
| @@ -81,6 +81,7 @@ class I2SAudioMicrophone : public I2SAudioIn, public microphone::Microphone, pub | |||||||
|   bool pdm_{false}; |   bool pdm_{false}; | ||||||
|  |  | ||||||
|   bool correct_dc_offset_; |   bool correct_dc_offset_; | ||||||
|  |   bool locked_driver_{false}; | ||||||
|   int32_t dc_offset_{0}; |   int32_t dc_offset_{0}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user