@@ -1383,6 +1383,7 @@ static int i2s_esp32_read(const struct device *dev, void **mem_block, size_t *si
13831383#if I2S_ESP32_IS_DIR_EN (rx )
13841384 const struct i2s_esp32_cfg * dev_cfg = dev -> config ;
13851385 const struct i2s_esp32_stream * stream = & dev_cfg -> rx ;
1386+ enum i2s_state state = stream -> data -> state ;
13861387 struct queue_item item ;
13871388 int err ;
13881389
@@ -1394,26 +1395,26 @@ static int i2s_esp32_read(const struct device *dev, void **mem_block, size_t *si
13941395 return - EINVAL ;
13951396 }
13961397
1397- if (stream -> data -> state == I2S_STATE_NOT_READY ) {
1398+ if (state == I2S_STATE_NOT_READY ) {
13981399 LOG_ERR ("RX invalid state: %d" , (int )stream -> data -> state );
13991400 return - EIO ;
1400- } else if (stream -> data -> state == I2S_STATE_ERROR &&
1401- k_msgq_num_used_get (& stream -> data -> queue ) == 0 ) {
1402- LOG_ERR ("RX queue empty" );
1403- return - EIO ;
14041401 }
14051402
14061403 err = k_msgq_get (& stream -> data -> queue , & item ,
1407- K_MSEC (stream -> data -> i2s_cfg .timeout ));
1408- if (err < 0 ) {
1404+ (state == I2S_STATE_ERROR ) ? K_NO_WAIT
1405+ : K_MSEC (stream -> data -> i2s_cfg .timeout ));
1406+ if (err == 0 ) {
1407+ * mem_block = item .buffer ;
1408+ * size = item .size ;
1409+ } else {
14091410 LOG_ERR ("RX queue empty" );
1410- return err ;
1411- }
14121411
1413- * mem_block = item .buffer ;
1414- * size = item .size ;
1412+ if (err == - ENOMSG ) {
1413+ err = - EIO ;
1414+ }
1415+ }
14151416
1416- return 0 ;
1417+ return err ;
14171418#else
14181419 * mem_block = NULL ;
14191420 * size = 0 ;
@@ -1428,34 +1429,33 @@ static int i2s_esp32_write(const struct device *dev, void *mem_block, size_t siz
14281429#if I2S_ESP32_IS_DIR_EN (tx )
14291430 const struct i2s_esp32_cfg * dev_cfg = dev -> config ;
14301431 const struct i2s_esp32_stream * stream = & dev_cfg -> tx ;
1432+ enum i2s_state state = stream -> data -> state ;
14311433 int err ;
14321434
14331435 if (!stream ) {
14341436 LOG_ERR ("I2S_DIR_TX not enabled" );
14351437 return - EINVAL ;
14361438 }
14371439
1438- if (stream -> data -> state != I2S_STATE_RUNNING &&
1439- stream -> data -> state != I2S_STATE_READY ) {
1440- LOG_ERR ("TX Invalid state: %d" , (int )stream -> data -> state );
1441- return - EIO ;
1442- }
1443-
14441440 if (size > stream -> data -> i2s_cfg .block_size ) {
14451441 LOG_ERR ("Max write size is: %zu" , stream -> data -> i2s_cfg .block_size );
14461442 return - EINVAL ;
14471443 }
14481444
1445+ if (state != I2S_STATE_RUNNING && state != I2S_STATE_READY ) {
1446+ LOG_ERR ("TX Invalid state: %d" , (int )state );
1447+ return - EIO ;
1448+ }
1449+
14491450 struct queue_item item = {.buffer = mem_block , .size = size };
14501451
14511452 err = k_msgq_put (& stream -> data -> queue , & item ,
14521453 K_MSEC (stream -> data -> i2s_cfg .timeout ));
14531454 if (err < 0 ) {
14541455 LOG_ERR ("TX queue full" );
1455- return err ;
14561456 }
14571457
1458- return 0 ;
1458+ return err ;
14591459#else
14601460 LOG_ERR ("I2S_DIR_TX not enabled" );
14611461 return - EINVAL ;
0 commit comments