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