AHierarchicalStateMachine.cpp revision 27c174483a8ae9688d5d4897c19074f62c7f1701
127c174483a8ae9688d5d4897c19074f62c7f1701James Dong/*
227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Copyright (C) 2010 The Android Open Source Project
327c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Licensed under the Apache License, Version 2.0 (the "License");
527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * you may not use this file except in compliance with the License.
627c174483a8ae9688d5d4897c19074f62c7f1701James Dong * You may obtain a copy of the License at
727c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
827c174483a8ae9688d5d4897c19074f62c7f1701James Dong *      http://www.apache.org/licenses/LICENSE-2.0
927c174483a8ae9688d5d4897c19074f62c7f1701James Dong *
1027c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Unless required by applicable law or agreed to in writing, software
1127c174483a8ae9688d5d4897c19074f62c7f1701James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * See the License for the specific language governing permissions and
1427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * limitations under the License.
1527c174483a8ae9688d5d4897c19074f62c7f1701James Dong */
1627c174483a8ae9688d5d4897c19074f62c7f1701James Dong
17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AHierarchicalStateMachine.h>
18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Vector.h>
22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
23f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
25f933441648ef6a71dee783d733aac17b9508b452Andreas HuberAState::AState(const sp<AState> &parentState)
26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : mParentState(parentState) {
27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
29f933441648ef6a71dee783d733aac17b9508b452Andreas HuberAState::~AState() {
30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
32f933441648ef6a71dee783d733aac17b9508b452Andreas Hubersp<AState> AState::parentState() {
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return mParentState;
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
36f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid AState::stateEntered() {
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
39f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid AState::stateExited() {
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
44f933441648ef6a71dee783d733aac17b9508b452Andreas HuberAHierarchicalStateMachine::AHierarchicalStateMachine() {
45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
47f933441648ef6a71dee783d733aac17b9508b452Andreas HuberAHierarchicalStateMachine::~AHierarchicalStateMachine() {
48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
50f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid AHierarchicalStateMachine::onMessageReceived(const sp<AMessage> &msg) {
51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AState> save = mState;
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AState> cur = mState;
54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    while (cur != NULL && !cur->onMessageReceived(msg)) {
55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // If you claim not to have handled the message you shouldn't
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // have called setState...
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        CHECK(save == mState);
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        cur = cur->parentState();
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (cur != NULL) {
63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGW("Warning message %s unhandled in root state.",
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         msg->debugString().c_str());
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
70f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid AHierarchicalStateMachine::changeState(const sp<AState> &state) {
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (state == mState) {
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        // Quick exit for the easy case.
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Vector<sp<AState> > A;
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AState> cur = mState;
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (;;) {
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        A.push(cur);
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (cur == NULL) {
81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        cur = cur->parentState();
84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    Vector<sp<AState> > B;
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    cur = state;
88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (;;) {
89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        B.push(cur);
90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (cur == NULL) {
91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        cur = cur->parentState();
94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    // Remove the common tail.
97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    while (A.size() > 0 && B.size() > 0 && A.top() == B.top()) {
98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        A.pop();
99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        B.pop();
100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mState = state;
103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = 0; i < A.size(); ++i) {
105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        A.editItemAt(i)->stateExited();
106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (size_t i = B.size(); i-- > 0;) {
109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        B.editItemAt(i)->stateEntered();
110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
114