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 <yang.jie@linux.intel.com>
This commit is contained in:
Keyon Jie 2019-04-11 15:37:50 +08:00 committed by Liam Girdwood
parent 8a220bc34c
commit cbf2be22ed
3 changed files with 42 additions and 39 deletions

View File

@ -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) {

View File

@ -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;

View File

@ -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,