From cbf2be22ed314ce9d3863bc7217b29d74bcfae3a Mon Sep 17 00:00:00 2001 From: Keyon Jie Date: Thu, 11 Apr 2019 15:37:50 +0800 Subject: [PATCH] component: refine state change for xrun handling When trigger xrun arrives, we will reset the component state to be READY, which means prepare will needed before we can recover. Update state machine diagram and cmoka unit test cases also. Signed-off-by: Keyon Jie --- src/audio/component.c | 7 ++- src/include/sof/audio/component.h | 52 ++++++++++--------- .../src/audio/component/comp_set_state.c | 22 ++++---- 3 files changed, 42 insertions(+), 39 deletions(-) diff --git a/src/audio/component.c b/src/audio/component.c index 0fb34a89e..236f8c9f4 100644 --- a/src/audio/component.c +++ b/src/audio/component.c @@ -159,17 +159,20 @@ int comp_set_state(struct comp_dev *dev, int cmd) } break; case COMP_TRIGGER_STOP: - case COMP_TRIGGER_XRUN: if (dev->state == COMP_STATE_ACTIVE || dev->state == COMP_STATE_PAUSED) { dev->state = COMP_STATE_PREPARE; } else { trace_comp_error("comp_set_state() error: " "wrong state = %u, " - "COMP_TRIGGER_STOP/XRUN", dev->state); + "COMP_TRIGGER_STOP", dev->state); ret = -EINVAL; } break; + case COMP_TRIGGER_XRUN: + /* reset component status to ready at xrun */ + dev->state = COMP_STATE_READY; + break; case COMP_TRIGGER_PAUSE: /* only support pausing for running */ if (dev->state == COMP_STATE_ACTIVE) { diff --git a/src/include/sof/audio/component.h b/src/include/sof/audio/component.h index 64ced4802..9bf56eb5f 100644 --- a/src/include/sof/audio/component.h +++ b/src/include/sof/audio/component.h @@ -68,29 +68,33 @@ /** * States may transform as below:- * \verbatim - * - * ------------- - * pause | | stop/xrun - * +-------------| ACTIVITY |---------------+ - * | | | | prepare - * | ------------- | +-----------+ - * | ^ ^ | | | - * | | | | | | - * v | | v | | - * ------------- | | ------------- | - * | | release | | start | | | - * | PAUSED |-----------+ +-------------| PREPARE |<-------+ - * | | | | - * ------------- ------------- - * | ^ ^ - * | stop/xrun | | - * +--------------------------------------+ | - * | prepare - * ------------- | - * | | | - * ----------->| READY |------------------+ - * reset | | - * ------------- + * +---------------------------------------+ + * | | + * ------------- | + * pause | | stop | + * +-------------| ACTIVITY |---------------+ | + * | | | | prepare | + * | ------------- | +---------+ | + * | ^ ^ | | | | + * | | | | | | | + * v | | v | | | + * ------------- | | ------------- | | + * | | release | | start | | | | + * | PAUSED |-----------+ +-------------| PREPARE |<-----+ | + * | | | | | + * ------------- ------------- | + * | ^ ^ | + * | stop | | | + * +--------------------------------------+ | | + * | prepare | + * ------------- | | + * | | | | + * ----------->| READY |------------------+ | + * reset | | | + * ------------- | + * ^ | + * | xrun | + * +---------------------------------------+ * * \endverbatim */ @@ -662,12 +666,12 @@ static inline int comp_get_requested_state(int cmd) break; case COMP_TRIGGER_PREPARE: case COMP_TRIGGER_STOP: - case COMP_TRIGGER_XRUN: state = COMP_STATE_PREPARE; break; case COMP_TRIGGER_PAUSE: state = COMP_STATE_PAUSED; break; + case COMP_TRIGGER_XRUN: case COMP_TRIGGER_RESET: state = COMP_STATE_READY; break; diff --git a/test/cmocka/src/audio/component/comp_set_state.c b/test/cmocka/src/audio/component/comp_set_state.c index 42084413b..b936bb321 100644 --- a/test/cmocka/src/audio/component/comp_set_state.c +++ b/test/cmocka/src/audio/component/comp_set_state.c @@ -78,10 +78,6 @@ struct test_case test_cases[] = { COMP_TRIGGER_STOP, NULL_STATE), TEST_CASE(SUCCEED, COMP_STATE_PAUSED, COMP_TRIGGER_STOP, NULL_STATE), - TEST_CASE(SUCCEED, COMP_STATE_ACTIVE, - COMP_TRIGGER_XRUN, NULL_STATE), - TEST_CASE(SUCCEED, COMP_STATE_PAUSED, - COMP_TRIGGER_XRUN, NULL_STATE), TEST_CASE(SUCCEED, COMP_STATE_ACTIVE, COMP_TRIGGER_PAUSE, NULL_STATE), TEST_CASE(SUCCEED, COMP_STATE_INIT, @@ -120,12 +116,6 @@ struct test_case test_cases[] = { NULL_STATE), TEST_CASE(FAIL, COMP_STATE_SUSPEND, COMP_TRIGGER_STOP, NULL_STATE), - TEST_CASE(FAIL, COMP_STATE_INIT, COMP_TRIGGER_XRUN, - NULL_STATE), - TEST_CASE(FAIL, COMP_STATE_READY, COMP_TRIGGER_XRUN, - NULL_STATE), - TEST_CASE(FAIL, COMP_STATE_SUSPEND, COMP_TRIGGER_XRUN, - NULL_STATE), TEST_CASE(FAIL, COMP_STATE_INIT, COMP_TRIGGER_PAUSE, NULL_STATE), TEST_CASE(FAIL, COMP_STATE_READY, COMP_TRIGGER_PAUSE, @@ -152,10 +142,16 @@ struct test_case test_cases[] = { COMP_TRIGGER_STOP, COMP_STATE_PREPARE), TEST_CASE(CORRECT_OUTPUT_STATE, COMP_STATE_PAUSED, COMP_TRIGGER_STOP, COMP_STATE_PREPARE), - TEST_CASE(CORRECT_OUTPUT_STATE, COMP_STATE_ACTIVE, - COMP_TRIGGER_XRUN, COMP_STATE_PREPARE), + TEST_CASE(CORRECT_OUTPUT_STATE, COMP_STATE_INIT, + COMP_TRIGGER_XRUN, COMP_STATE_READY), + TEST_CASE(CORRECT_OUTPUT_STATE, COMP_STATE_SUSPEND, + COMP_TRIGGER_XRUN, COMP_STATE_READY), + TEST_CASE(CORRECT_OUTPUT_STATE, COMP_STATE_PREPARE, + COMP_TRIGGER_XRUN, COMP_STATE_READY), TEST_CASE(CORRECT_OUTPUT_STATE, COMP_STATE_PAUSED, - COMP_TRIGGER_XRUN, COMP_STATE_PREPARE), + COMP_TRIGGER_XRUN, COMP_STATE_READY), + TEST_CASE(CORRECT_OUTPUT_STATE, COMP_STATE_ACTIVE, + COMP_TRIGGER_XRUN, COMP_STATE_READY), TEST_CASE(CORRECT_OUTPUT_STATE, COMP_STATE_ACTIVE, COMP_TRIGGER_PAUSE, COMP_STATE_PAUSED), TEST_CASE(CORRECT_OUTPUT_STATE, COMP_STATE_INIT,