mirror of
https://github.com/espressif/esp-idf.git
synced 2026-04-27 19:13:21 +00:00
Merge branch 'bugfix/fixed_i2s_write_invalid_offset_issue_v5.3' into 'release/v5.3'
fix(i2s): fixed invalid offset in the big gap writing scenario (v5.3) See merge request espressif/esp-idf!42754
This commit is contained in:
@@ -1214,7 +1214,12 @@ esp_err_t i2s_channel_write(i2s_chan_handle_t handle, const void *src, size_t si
|
||||
ESP_RETURN_ON_FALSE(xSemaphoreTake(handle->binary, pdMS_TO_TICKS(timeout_ms)) == pdTRUE, ESP_ERR_INVALID_STATE, TAG, "The channel is not enabled");
|
||||
src_byte = (char *)src;
|
||||
while (size > 0 && handle->state == I2S_CHAN_STATE_RUNNING) {
|
||||
if (handle->dma.rw_pos == handle->dma.buf_size || handle->dma.curr_ptr == NULL) {
|
||||
/* Acquire the new DMA buffer while:
|
||||
* 1. The current buffer is fully filled
|
||||
* 2. The current buffer is not set
|
||||
* 3. The queue is almost full, i.e., the curr_ptr is nearly to be invalid
|
||||
*/
|
||||
if (handle->dma.rw_pos == handle->dma.buf_size || handle->dma.curr_ptr == NULL || uxQueueSpacesAvailable(handle->msg_queue) <= (handle->dma.desc_num > 2 ? 1 : 0)) {
|
||||
if (xQueueReceive(handle->msg_queue, &(handle->dma.curr_ptr), pdMS_TO_TICKS(timeout_ms)) == pdFALSE) {
|
||||
ret = ESP_ERR_TIMEOUT;
|
||||
break;
|
||||
@@ -1259,7 +1264,12 @@ esp_err_t i2s_channel_read(i2s_chan_handle_t handle, void *dest, size_t size, si
|
||||
/* The binary semaphore can only be taken when the channel has been enabled and no other reading operation in progress */
|
||||
ESP_RETURN_ON_FALSE(xSemaphoreTake(handle->binary, pdMS_TO_TICKS(timeout_ms)) == pdTRUE, ESP_ERR_INVALID_STATE, TAG, "The channel is not enabled");
|
||||
while (size > 0 && handle->state == I2S_CHAN_STATE_RUNNING) {
|
||||
if (handle->dma.rw_pos == handle->dma.buf_size || handle->dma.curr_ptr == NULL) {
|
||||
/* Acquire the new DMA buffer while:
|
||||
* 1. The current buffer is fully filled
|
||||
* 2. The current buffer is not set
|
||||
* 3. The queue is almost full, i.e., the curr_ptr is nearly to be invalid
|
||||
*/
|
||||
if (handle->dma.rw_pos == handle->dma.buf_size || handle->dma.curr_ptr == NULL || uxQueueSpacesAvailable(handle->msg_queue) <= (handle->dma.desc_num > 2 ? 1 : 0)) {
|
||||
if (xQueueReceive(handle->msg_queue, &(handle->dma.curr_ptr), pdMS_TO_TICKS(timeout_ms)) == pdFALSE) {
|
||||
ret = ESP_ERR_TIMEOUT;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user